PHPackages                             onemustcode/query - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. onemustcode/query

ActiveLibrary[Database &amp; ORM](/categories/database)

onemustcode/query
=================

It simply transforms the given filters, sortings and paging to a Doctrine or Eloquent query. Handy for interal usage or it can be used for API's.

v1.1.6(8y ago)426.8k2[5 issues](https://github.com/onemustcode/query/issues)1MITPHPPHP &gt;=5.6.4

Since Feb 4Pushed 8y ago1 watchersCompare

[ Source](https://github.com/onemustcode/query)[ Packagist](https://packagist.org/packages/onemustcode/query)[ RSS](/packages/onemustcode-query/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (3)Versions (25)Used By (1)

[![Build Status](https://camo.githubusercontent.com/a641725d01270861abe751bf966da897b95e3be1e87433ff2cc685618dd25ed3/68747470733a2f2f7472617669732d63692e6f72672f6f6e656d757374636f64652f71756572792e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/onemustcode/query)[![Total Downloads](https://camo.githubusercontent.com/6841f2154c5b3e91c39eb16bfed79517f37c5d41af230c64873a6ee1ee708565/68747470733a2f2f706f7365722e707567782e6f72672f6f6e656d757374636f64652f71756572792f642f746f74616c2e737667)](https://packagist.org/packages/onemustcode/query)[![Latest Stable Version](https://camo.githubusercontent.com/3ca7c09200bcb31c5b7d69c02b7594619e7e3ecfd2ff2b637ba88ebd09614a0f/68747470733a2f2f706f7365722e707567782e6f72672f6f6e656d757374636f64652f71756572792f762f737461626c65)](https://packagist.org/packages/onemustcode/query)[![License](https://camo.githubusercontent.com/18553ceb075fc06c78076b1c2abe265457be9e1434f779f6bce0d3a346e0a2d5/68747470733a2f2f706f7365722e707567782e6f72672f6f6e656d757374636f64652f71756572792f6c6963656e7365)](https://packagist.org/packages/onemustcode/query)

Query
=====

[](#query)

It simply transforms the given filters, sortings and paging to a Doctrine or Eloquent query. Handy for interal usage or it can be used for API's.

Installation
------------

[](#installation)

Require the Query library trough composer.

```
composer require onemustcode/query

```

Query
-----

[](#query-1)

The Query holds the paging, sortings, filters and includes.

Create new Query instance;

```
$query = new Query();

```

### Paging

[](#paging)

Change the results per page;

```
$query->getPaging()->setPerPage(50);

```

Change the page;

```
$query->getPaging()->setPage(5);

```

Create an Query instance directly from given Paging object;

```
$query = Query::createFromPaging(new Paging(3, 40));

```

### Filtering

[](#filtering)

The following filters can be used;

TypeClassEqualsnew Equals('field', 'value')Not Equalsnew NotEquals('field', 'value')Greather thannew GreatherThan('field', 20)Greather than or Equalsnew GreatherThanOrEquals('field', 25)Less thannew LessThan('field', 50)Less than or Equalsnew LessThanOrEquals('field', 55)Is nullnew IsNull('field')Is not nullnew IsNotNull('field')Innew In('field', '1,2,3,4,5')Not innew NotIn('field', '1,2,3,4,5')Likenew Like('field', '%ohn%')Add new filter to existing Query instance;

```
$query->addFilter(new Equals('last_name', 'john'));

```

Create an Query instance directly from one or more filters;

```
$query = Query::createFromFilters([
    new Equals('name', 'john),
    new GreatherThan('age', 23),
]);

```

### Sorting

[](#sorting)

Add new sorting to existing Query instance;

```
$query->addSorting(new Ascending('last_name'));

```

Create an Query instance directly from one or more sortings;

```
$query = Query::createFromSortings([
    new Ascending('name'),
    new Descending('score'),
]);

```

### Includes

[](#includes)

Add new include to existing Query instance;

```
$query->addInclude('posts.comments);

```

Create an Query instance directly from one or more includes;

```
$query = Query::createFromIncludes([
    'relation', 'some_other.relation'
]);

```

Builder
-------

[](#builder)

*Warning: The Builder class is deprecated, use the transformer instead.*

The builder turns an given array to an Query instance;

```
$data = [
    'per_page' => 20,
    'page' => 2,
    'filters' => [
        'age' => ['eq' => 15],
        'last_name' => ['like' => 'doe%'],
    ],
    'sortings' => [
        'first_name' => 'asc',
        'score' => 'desc',
    ],
];

$builder = new Builder($data);
$query = $builder->build();

```

Transformer
===========

[](#transformer)

The builder transforms an given array to an Query instance;

```
$data = [
    'per_page' => 20,
    'page' => 2,
    'filters' => [
        'age' => ['eq' => 15],
        'last_name' => ['like' => 'doe%'],
    ],
    'sortings' => [
        'first_name' => 'asc',
        'score' => 'desc',
    ],
];

$transformer = new Transformer();
$query = $transformer->transform($data);

```

It is possible to add your own custom filters. In order to do this you should pass them as an associative array in the constructor (note that the filter should implement the OneMustCode\\Query\\Filters\\FilterInterface\]). The key should be the filters's operator and the value the filter's FQN;

```
$transformer = new Transformer([CustomFilter::OPERATOR => CustomFilter::class]);
$query = $transformer->transform($data);

```

Writer
------

[](#writer)

The writer can export the given Query instance to json, query parameters and an array.

### Json

[](#json)

```
$writer = new Writer($query);
$parameters = $writer->toJson();

```

### Array

[](#array)

```
$writer = new Writer($query);
$parameters = $writer->toArray();

```

### Query parameters

[](#query-parameters)

```
$writer = new Writer($query);
$parameters = $writer->toQueryParameters();

```

Doctrine Query Builder
----------------------

[](#doctrine-query-builder)

The following example code shows you how to use the Doctrine Query Builder. Just pass the Query instance, Doctrine Query Builder, the accepted filters or sortings and it will automatically generate the query for you.

Example;

```
// Get the Doctrine Query Builder
$queryBuilder = $this->createQueryBuilder('e');

// Create new Query instance from given filters en sortings
$query = new Query(null, [
    new GreatherThan('age', 25),
    new LessThan('age', 55),
], [
    new Ascending('last_name')),
]);

// Only accept certain sortings that can be added to the doctrine query builder
$acceptedSortings = [
    // Given field => Doctrine property
    'age' => 'e.age',
];

// Only accept certain filters that can be added to the doctrine query builder
$acceptedFilters = [
    // Given field => Doctrine property
    'first_name' => 'e.firstName',
    'last_name' => 'e.lastName',
    'age' => 'e.age',
];

// Build the query
$queryBuilder = (new QueryBuilder())->build($query, $queryBuilder, $acceptedFilters, $acceptedSortings);

// Retrieve the results via Doctrine
$results = $queryBuilder->getQuery()->getResults();

```

It is possible to add your own custom filter handlers. In order to do this you should pass in the handler in the QueryBuilder's constructor (note that the filter handler should implement the OneMustCode\\Query\\Builders\\Doctrine\\Filters\\FilterHandlerInterface);

```
$queryBuilder = (new QueryBuilder([new CustomFilterHandler()]))->build($query, $queryBuilder, $acceptedFilters, $acceptedSortings);

```

License
-------

[](#license)

MIT

###  Health Score

32

—

LowBetter than 72% of packages

Maintenance0

Infrequent updates — may be unmaintained

Popularity32

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity68

Established project with proven stability

 Bus Factor1

Top contributor holds 92.9% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~13 days

Recently: every ~24 days

Total

24

Last Release

3093d ago

Major Versions

v0.1.4 → v1.0.02017-02-25

### Community

Maintainers

![](https://www.gravatar.com/avatar/b7ea4daaa558cb0bdc7afff101dbd1ba0f2c52468a488718368b6538a4926da9?d=identicon)[onemustcode](/maintainers/onemustcode)

---

Top Contributors

[![blackvault-bv](https://avatars.githubusercontent.com/u/25415479?v=4)](https://github.com/blackvault-bv "blackvault-bv (26 commits)")[![cwdt](https://avatars.githubusercontent.com/u/9107601?v=4)](https://github.com/cwdt "cwdt (2 commits)")

---

Tags

apisymfonylaraveldoctrineeloquentquerypagingfilteringsorting

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/onemustcode-query/health.svg)

```
[![Health](https://phpackages.com/badges/onemustcode-query/health.svg)](https://phpackages.com/packages/onemustcode-query)
```

###  Alternatives

[indexzer0/eloquent-filtering

Powerful eloquent filtering

22425.9k3](/packages/indexzer0-eloquent-filtering)[reedware/laravel-relation-joins

Adds the ability to join on a relationship by name.

2121.2M13](/packages/reedware-laravel-relation-joins)[matthenning/eloquent-api-filter

Awesome and simple way to filter Eloquent queries right from the API URL without the clutter.

104.9k](/packages/matthenning-eloquent-api-filter)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
