Doctrine query builder using inner join with conditions Doctrine query builder using inner join with conditions symfony symfony

Doctrine query builder using inner join with conditions


I'm going to answer my own question.

  1. innerJoin should use the keyword "WITH" instead of "ON" (Doctrine's documentation [13.2.6. Helper methods] is inaccurate; [13.2.5. The Expr class] is correct)
  2. no need to link foreign keys in join condition as they're already specified in the entity mapping.

Therefore, the following works for me

$qb->select('c')    ->innerJoin('c.phones', 'p', 'WITH', 'p.phone = :phone')    ->where('c.username = :username');

or

$qb->select('c')    ->innerJoin('c.phones', 'p', Join::WITH, $qb->expr()->eq('p.phone', ':phone'))    ->where('c.username = :username');


You can explicitly have a join like this:

$qb->innerJoin('c.phones', 'p', Join::ON, 'c.id = p.customerId');

But you need to use the namespace of the class Join from doctrine:

use Doctrine\ORM\Query\Expr\Join;

Or if you prefere like that:

$qb->innerJoin('c.phones', 'p', Doctrine\ORM\Query\Expr\Join::ON, 'c.id = p.customerId');

Otherwise, Join class won't be detected and your script will crash...

Here the constructor of the innerJoin method:

public function innerJoin($join, $alias, $conditionType = null, $condition = null);

You can find other possibilities (not just join "ON", but also "WITH", etc...) here: http://docs.doctrine-project.org/en/2.0.x/reference/query-builder.html#the-expr-class

EDIT

Think it should be:

$qb->select('c')    ->innerJoin('c.phones', 'p', Join::ON, 'c.id = p.customerId')    ->where('c.username = :username')    ->andWhere('p.phone = :phone');    $qb->setParameters(array(        'username' => $username,        'phone' => $phone->getPhone(),    ));

Otherwise I think you are performing a mix of ON and WITH, perhaps the problem.