9

Here is the dql-query

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)"; $q = $em->createQuery($dql) ->setParameter(1, '108919,108920'); $result = $q->execute(); 

if i pass parameters through setParameter doctrine returns only first result, but if i put them directly into the dql-query it returns 2 results (this is correct):

$dql = "SELECT t Entities\Table t WHERE t.field1 IN (108919,108920)"; 

How to deal with "IN" in WHERE-clause through setParameter?

5 Answers 5

9

Be aware that this only works for numbered parameters, and not named parameters.

$searchParameters = array(108919, 108920); $dql = "SELECT t Entities\Table t WHERE t.field IN (?1)"; $q = $em->createQuery($dql) ->setParameter(1, $searchParameters); $result = $q->execute(); 
Sign up to request clarification or add additional context in comments.

2 Comments

I was tearing my hair out trying to figure out why I couldn't get array parameters to work - replacing named parameter with numbered saved my day :-)
I just came across this question and tried it with a named parameter anyway. Seems like somewhere between this answer and now, Doctrine was changed to allow this construction for named parameters as well.
6

The following should work fine:

$searchParameters = array(108919, 108920); $dql = "SELECT t Entities\Table t WHERE t.field IN (?1)"; $q = $em->createQuery($dql) ->setParameter(1, $searchParameters); $result = $q->execute(); 

You can pass in an array, without using implode() and doctrine will handle it properly (as a list of integers).

Note: if you're already working with the string '108919, 108920' -- you will need to use the explode and trim functions.

This is also mentioned here: How to use the in statement in DQL in Doctrine 2.0

1 Comment

This works for me and thus I would assume is the correct answer to this question.
1

The following should work as expected (for an arbitrary numer of arguments to the IN clause)

$params = array(1 => 108919, 2 => 108920); $qb = $em->createQueryBuilder(); $qb->select(array('t')) ->from('Entities\Table', 't') ->where($qb->expr()-> in('t.field', array_map(function($p) { return '?'.$p; }, array_keys($params))) ->setParameters($params); $q = $qb->getQuery(); $r = $q->getResult(); 

Comments

0

Solution 1 :

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1, ?2)"; $q = $em->createQuery($dql) ->setParameters(array(1 =>'108919', 2 => '108920')); $result = $q->execute(); 

Solution 2 (more elegant) :

$parameters = array(1 =>'108919', 2 => '108920'); $dql = 'SELECT t Entities\Table t WHERE t.field IN (?'.implode(', ?', array_keys($parameters)).')'; $q = $em->createQuery($dql) ->setParameters($parameters); $result = $q->execute(); 

Comments

0

This is working

public function searchCategory($target){ $query = $this->getEntityManager() ->createQuery("SELECT ct.id as id,ct.name as name, ct.target as target FROM LoveThatFitAdminBundle:ClothingType ct WHERE ct.target IN (:target)") ->setParameter('target',$target['target']); try { return $query->getResult(); } catch (\Doctrine\ORM\NoResultException $e) { return null; } } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.