DDC-921: QueryBuilder: Defining a "WHERE IN (...)" constraint using QueryBuilder::expr()->in() doesn't allow parameter binding for array of values #1143

Open
opened 2026-01-22 13:03:37 +01:00 by admin · 0 comments
Owner

Originally created by @doctrinebot on GitHub (Dec 9, 2010).

Originally assigned to: @beberlei on GitHub.

Jira issue originally created by user markus.woessner:

Following statement issues Doctrine\ORM\Query\QueryException:

$qb = new Doctrine\ORM\QueryBuilder($em);
$qb
->select('u')
->from('Entities\User', 'u')
->where($qb->expr()->in('u.name', array('?1', '?2')))
->setParameters(array(1 => 'Hans', 2 => 'Lieselotte'))
->getQuery()->execute();

Doctrine\ORM\Query\QueryException: "Invalid parameter number: number of bound variables does not match number of tokens."

$qb->getDql() will return "SELECT u FROM Entities\User u WHERE u.name IN('?1', '?2')"
As you can see placeholder variables are quoted due to Doctrine\ORM\Query\Expr::in($x, $y) which expects $y to be an array of Expr\Literal instances. Otherwise it will quote given strings. I can't think that doing something like...

$qb->where($qb->expr()->in('u.name', array(new Expr\Literal('?1'), new Expr\Literal('?2'))))

... is very convenient syntax. Is it?

Originally created by @doctrinebot on GitHub (Dec 9, 2010). Originally assigned to: @beberlei on GitHub. Jira issue originally created by user markus.woessner: Following statement issues Doctrine\ORM\Query\QueryException: $qb = new Doctrine\ORM\QueryBuilder($em); $qb ->select('u') ->from('Entities\User', 'u') ->where($qb->expr()->in('u.name', array('?1', '?2'))) ->setParameters(array(1 => 'Hans', 2 => 'Lieselotte')) ->getQuery()->execute(); Doctrine\ORM\Query\QueryException: "Invalid parameter number: number of bound variables does not match number of tokens." $qb->getDql() will return "SELECT u FROM Entities\User u WHERE u.name IN('?1', '?2')" As you can see placeholder variables are quoted due to Doctrine\ORM\Query\Expr::in($x, $y) which expects $y to be an array of Expr\Literal instances. Otherwise it will quote given strings. I can't think that doing something like... $qb->where($qb->expr()->in('u.name', array(new Expr\Literal('?1'), new Expr\Literal('?2')))) ... is very convenient syntax. Is it?
admin added the Bug label 2026-01-22 13:03:37 +01:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#1143