Doctrine query builder using inner join with conditions
I'm going to answer my own question.
- 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)
- 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.