Как бороться с «IN» в WHERE-предложении в Doctrine2 - PullRequest
9 голосов
/ 27 декабря 2010

Вот dql-запрос

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

если я передаю параметры через setParameter, доктрина возвращает только первый результат, но если я помещаю их непосредственно в dql-запрос, он возвращает 2 результата (это правильно):

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

Как бороться с "IN" в WHERE-предложении через setParameter?

Ответы [ 5 ]

9 голосов
/ 17 февраля 2012

Имейте в виду, что это работает только для пронумерованных параметров, а не именованных параметров.

$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();
6 голосов
/ 11 декабря 2011

Следующее должно работать нормально:

$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();

Вы можете передать массив, не используя implode (), и doctrine будет обрабатывать его правильно (как список целых чисел).

Примечание: если вы уже работаете со строкой «108919, 108920» - вам нужно использовать функции разнесения и обрезки.

Это также упоминается здесь: Как использовать оператор in в DQL в Doctrine 2.0

1 голос
/ 23 сентября 2011

Следующее должно работать как ожидалось (для произвольного числа аргументов в предложении IN)

$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();
0 голосов
/ 07 октября 2013

Это работает

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;
                }

 }
0 голосов
/ 23 сентября 2011

Решение 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();

Решение 2 (более элегантно):

$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();
...