PHPackages                             carrooi/doctrine-queries - 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. carrooi/doctrine-queries

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

carrooi/doctrine-queries
========================

Builder for doctrine query builders based on kdyby/doctrine

1.2.1(10y ago)0461MITPHP

Since Mar 25Pushed 10y ago1 watchersCompare

[ Source](https://github.com/Carrooi/Doctrine-Queries)[ Packagist](https://packagist.org/packages/carrooi/doctrine-queries)[ RSS](/packages/carrooi-doctrine-queries/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (4)Versions (6)Used By (0)

Carrooi/DoctrineQueries
=======================

[](#carrooidoctrinequeries)

[![Build Status](https://camo.githubusercontent.com/aed3a6aba5ee27a268d12489bd4bed703461a24881b644f0533423fc24c5f3f4/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f436172726f6f692f446f637472696e652d517565726965732e7376673f7374796c653d666c61742d737175617265)](https://travis-ci.org/Carrooi/Doctrine-Queries)[![Donate](https://camo.githubusercontent.com/7f8b0c0980ad316210d1ec0c7d3298ace87d2f7c0eb6911977c0644951af5bd2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f6e6174652d50617950616c2d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=F3SNC38XAUP56)

Builder for doctrine query builders based on kdyby/doctrine

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

[](#installation)

```
$ composer require carrooi/doctrine-queries

```

QueryObject
-----------

[](#queryobject)

Please, first read documentation of kdyby's [QueryObjects](https://github.com/Kdyby/Doctrine/blob/master/docs/en/resultset.md#queryobject).

```
class UserQuery extends Carrooi\Doctrine\Queries\QueryObject
{

	public function byId($id)
	{
		$this->addFilter(function(QueryBuilder $qb) use ($id) {
			$qb->andWhere('u.id = :id')->setParameter('id', $id);
		});

		return $this;
	}

	public function doCreateQuery(Queryable $repository)
	{
		$qb = $repository->createQueryBuilder()
			->select('u')->from('App\User', 'u');

		$this
			->applyFilters($qb)
			->applySelectFilters($qb);

		// or just:
		// $this->applyAllFilters($qb);

		return $qb;
	}

}
```

### Select filters

[](#select-filters)

```
class UserQuery extends Carrooi\Doctrine\Queries\QueryObject
{

	public function selectCount()
	{
		$this->addSelectFilter(function(QueryBuilder $qb) {
			$qb->select('COUNT(u)');
		});

		return $this;
	}

}
```

### Selects

[](#selects)

If you have more methods which selects different columns, you will run into errors about already selected columns. You can avoid that by using some helper methods.

```
class UserQuery extends Carrooi\Doctrine\Queries\QueryObject
{

	public function selectNick()
	{
		$this->trySelect('u', ['nick']);
		return $this;
	}

	public function selectEmail()
	{
		$this->trySelect('u', ['email']);
		return $this;
	}

}
```

**DQL:** `SELECT PARTIAL u.{id,nick,email} FROM ...`

With result alias:

```
class UserQuery extends Carrooi\Doctrine\Queries\QueryObject
{

	public function selectNickAndEmail()
	{
		$this->trySelect('u', ['user' => ['nick', 'email']]);
		return $this;
	}

}
```

**DQL:** `SELECT PARTIAL u.{id,nick,email} AS user FROM ...`

Or with distinct:

```
class UserQuery extends Carrooi\Doctrine\Queries\QueryObject
{

	public function selectNick()
	{
		$this->tryDistinctSelect('u', ['nick']);
		return $this;
	}

}
```

You can also use classic column selects without partials. That can be useful for example for array hydration.

```
class UserQuery extends Carrooi\Doctrine\Queries\QueryObject
{

	public function selectNick()
	{
		$this->trySelect('u', [
			'nick' => 'nickAlias',				// nickAlias will be name of result key
		]);
		return $this;
	}

	public function selectEmail()
	{
		$this->trySelect('u', ['email']); 		// you can combine partial and classic column selects
		return $this;
	}

}
```

**DQL:** `SELECT u.nick AS nickAlias, PARTIAL u.{id,email} FROM ...`

### Joins

[](#joins)

Same problem like with selects is with joins. If you will try to join same relation many times, you will get error. Again, there are methods for that.

```
class UserQuery extends Carrooi\Doctrine\Queries\QueryObject
{

	public function byBookName($name)
	{
		$this->tryJoin('u.books', 'b');		// INNER JOIN

		$this->addFilter(function(QueryBuilder $qb) use ($name) {
			$qb->andWhere('b.name = :name')->setParameter('name', $name);
		});

		return $this;
	}

}
```

You can also use `tryLeftJoin` method.

### Helpers

[](#helpers)

- `$query->addParameters(QueryBuilder $qb, array $parameters)`: set parameters without overwriting the old ones

### Nested trees searching

[](#nested-trees-searching)

If you are using eg. gedmo nested trees, you could also use `TNestedTreeQuery` trait for simple searching in tree.

```
class UserQuery extends Carrooi\Doctrine\Queries\QueryObject
{

	use Carrooi\Doctrine\Queries\Tree\TNestedTreeQuery;

	public function byTree(array $entities)
	{
		// ... some joins

		$this->addFilter(function(QueryBuilder $qb) use ($entities) {
			$condition = $this->createNestedTreeSearchCondition($entities, 'entityAlias');

			$qb->andWhere($condition->getCondition());
            $query->addParameters($qb, $condition->getParameters());
		});
	}

}
```

That example will find all entities in database with at least one entity from given array of entities, even they are same, in some children entity or some parent entity.

**Search by at least one entity (uses OR)** `default`

```
use Carrooi\Doctrine\Queries\Tree\SearchType;

$query->createNestedTreeSearchCondition($entities, 'entityAlias', SearchType::CONDITION_OR);
```

**Search by all entities (uses AND)**

```
use Carrooi\Doctrine\Queries\Tree\SearchType;

$query->createNestedTreeSearchCondition($entities, 'entityAlias', SearchType::CONDITION_AND);
```

**Search only for same, in parents and in children** `default`

```
use Carrooi\Doctrine\Queries\Tree\SearchType;

$query->createNestedTreeSearchCondition($entities, 'entityAlias', null, SearchType::SEARCH_EVERYWHERE);
```

**Search only for same**

```
use Carrooi\Doctrine\Queries\Tree\SearchType;

$query->createNestedTreeSearchCondition($entities, 'entityAlias', null, SearchType::SEARCH_FOR_SAME);
```

**Search only in parents**

```
use Carrooi\Doctrine\Queries\Tree\SearchType;

$query->createNestedTreeSearchCondition($entities, 'entityAlias', null, SearchType::SEARCH_IN_PARENTS);
```

**Search only in children**

```
use Carrooi\Doctrine\Queries\Tree\SearchType;

$query->createNestedTreeSearchCondition($entities, 'entityAlias', null, SearchType::SEARCH_IN_CHILDREN);
```

**Combined searching**

```
use Carrooi\Doctrine\Queries\Tree\SearchType;

$query->createNestedTreeSearchCondition($entities, 'entityAlias', null, SearchType::SEARCH_IN_PARENTS | SearchType::SEARCH_IN_CHILDREN);
```

**Custom column names**

`TNestedTreeQuery` trait will use by default these column names:

- `id`
- `level`
- `root`
- `left`
- `right`

But if you need, you can use custom names:

```
use Carrooi\Doctrine\Queries\Tree\SearchType;

$query->createNestedTreeSearchCondition($entities, 'entityAlias', null, null, [
	'id' => 'id',
	'level' => 'lvl',
	'root' => 'root',
	'left' => 'lft',
	'right' => 'rgt',
]);
```

### Getting results

[](#getting-results)

- `getQueryBuilder()`
- `getResultSet()`
- `getResult()`
- `getPairs()`
- `getOneOrNullResult()`
- `getSingleScalarResult()`

Changelog
---------

[](#changelog)

- 1.2.1

    - Change dependencies
- 1.2.0

    - Better aliases in tree searching DQLs
    - Support for classic custom column selects (not just partials)
    - Add option to set result alias for partial selects
- 1.1.0

    - Add field function for DQL
    - Add TNestedTreeQuery trait for searching in nested trees
- 1.0.1

    - Do not rewrite existing joins
- 1.0.0

    - Initial version

###  Health Score

30

—

LowBetter than 64% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity12

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity67

Established project with proven stability

 Bus Factor1

Top contributor holds 100% 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 ~105 days

Total

5

Last Release

3650d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/838c6933d498fdb2a31f251ed45006a6ef97935ea2a27f38dab7738038939fc9?d=identicon)[david\_kudera](/maintainers/david_kudera)

---

Top Contributors

[![davidkudera](https://avatars.githubusercontent.com/u/1174072?v=4)](https://github.com/davidkudera "davidkudera (21 commits)")

---

Tags

databasedoctrinequerybuildercarrooi

### Embed Badge

![Health badge](/badges/carrooi-doctrine-queries/health.svg)

```
[![Health](https://phpackages.com/badges/carrooi-doctrine-queries/health.svg)](https://phpackages.com/packages/carrooi-doctrine-queries)
```

###  Alternatives

[envms/fluentpdo

FluentPDO is a quick and light PHP library for rapid query building. It features a smart join builder, which automatically creates table joins.

925511.7k13](/packages/envms-fluentpdo)[fpdo/fluentpdo

FluentPDO is a quick and light PHP library for rapid query building. It features a smart join builder, which automatically creates table joins.

921244.9k7](/packages/fpdo-fluentpdo)[clancats/hydrahon

Fast &amp; standalone PHP MySQL Query Builder library.

281205.5k5](/packages/clancats-hydrahon)[krzysztof-gzocha/searcher

Searcher is a framework-agnostic search query builder. Search queries are written using Criterias and can be run against MySQL, MongoDB, ElasticSearch or even files.

11861.6k1](/packages/krzysztof-gzocha-searcher)[mpyw/laravel-local-class-scope

A tiny macro that reuse a global scope class as a local scope

24102.6k](/packages/mpyw-laravel-local-class-scope)[chillerlan/php-database

An extensible database wrapper and query builder.

431.2k2](/packages/chillerlan-php-database)

PHPackages © 2026

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