Как использовать ГДЕ с Doctrine 2 - PullRequest
114 голосов
/ 08 мая 2011

У меня есть следующий код, который выдает мне ошибку:

Message: Invalid parameter number: number of bound variables does not match number of tokens 

Код:

public function getCount($ids, $outcome)
{
    if (!is_array($ids)) {
        $ids = array($ids);
    }
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->add('select', $qb->expr()->count('r.id'))
       ->add('from', '\My\Entity\Rating r');
    if ($outcome === 'wins') { 
        $qb->add('where', $qb->expr()->in('r.winner', array('?1')));
    }
    if ($outcome === 'fails') {
        $qb->add('where', $qb->expr()->in('r.loser', array('?1')));
    }
    $qb->setParameter(1, $ids);
    $query = $qb->getQuery();
    //die('q = ' . $qb);
    return $query->getSingleScalarResult();
}

Данные (или идентификаторы $):

Array
(
    [0] => 566
    [1] => 569
    [2] => 571
)

Результат DQL:

q = SELECT COUNT(r.id) FROM \My\Entity\Rating r WHERE r.winner IN('?1')

Ответы [ 12 ]

0 голосов
/ 07 февраля 2017

Я боролся с тем же сценарием, когда мне нужно было выполнить запрос к массиву значений.

Для меня сработало следующее:

http://docs.doctrine -project.org/projects/doctrine1/en/latest/en/manual/dql-doctrine-query-language.html#where-clause

->andWhereIn("[fieldname]", [array[]])

Пример массива данных (работает со строками и целыми числами):

$ids = array(1, 2, 3, 4);

Пример запроса (адаптируйтесь туда, где он вам нужен):

$q = dataTable::getInstance()
    ->createQuery()
    ->where("name = ?",'John')
    ->andWhereIn("image_id", $ids)
    ->orderBy('date_created ASC')
    ->limit(100);

$q->execute();
0 голосов
/ 25 марта 2016
->where($qb->expr()->in('foo.bar', ':data'))
            ->setParameter('participants', $data);

Также работает с:

 ->andWhere($qb->expr()->in('foo.bar', ':users'))
                ->setParameter('data', $data);
...