У меня есть следующий код, который дает мне ошибку:
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();
}
Данные (или $ ids):
Array
(
[0] => 566
[1] => 569
[2] => 571
)
Результат DQL:
q = SELECT COUNT(r.id) FROM \My\Entity\Rating r WHERE r.winner IN('?1')
php
doctrine-orm
query-builder
Tjorriemorrie
источник
источник
Ответы:
Изучая эту проблему, я обнаружил кое-что, что будет важно для всех, кто сталкивается с этой же проблемой и ищет решение.
Из исходного сообщения следующая строка кода:
Заключение именованного параметра в массив вызывает проблему с номером связанного параметра. Удалив его из оболочки массива:
Эта проблема должна быть исправлена. Это могло быть проблемой в предыдущих версиях Doctrine, но она исправлена в самых последних версиях 2.0.
источник
$qb->expr()->in()
есть только в Doctrine 2 ORM, но не в Doctrine DBAL.$qb->expr()->in()
действительно находится в DBALСамый простой способ сделать это - привязать сам массив как параметр:
источник
->where('b.status IN (:statuses)') ->setParameters([ 'customerId' => $customerId, 'storeId' => $storeId, 'statuses' => [Status::OPEN, Status::AWAITING_APPROVAL, Status::APPROVED] ]);
setParameter
в силуConnection::PARAM_STR_ARRAY
и для завершения струнное решение
источник
Я обнаружил, что, несмотря на то, что указано в документации, единственный способ заставить это работать - это так:
http://groups.google.com/group/doctrine-dev/browse_thread/thread/fbf70837293676fb
источник
Я знаю, что это старый пост, но он может кому-то помочь. Я бы проголосовал и улучшил ответ @Daniel Espendiller, ответив на вопрос, заданный в комментариях о ints
Чтобы это работало для int должным образом, убедитесь, что значения в массиве имеют тип int, вы можете ввести cast в int перед передачей ...
Проверено на выбор / удаление в symfony 3.4 и doctrine-bundle: 1.8
источник
Я знаю, что пример OP использует DQL и построитель запросов, но я наткнулся на это, пытаясь понять, как это сделать с контроллера или вне класса репозитория, так что, возможно, это поможет другим.
Вы также можете сделать это
WHERE IN
с контроллера следующим образом:источник
Лучший способ сделать это - особенно если вы добавляете более одного условия - это:
Если ваш массив значений содержит строки, вы не можете использовать метод setParameter с развернутой строкой, потому что ваши кавычки будут экранированы!
источник
Вот как я это использовал:
источник
Нашел как это сделать в 2016 году: https://redbeardtechnologies.wordpress.com/2011/07/01/doctrine-2-dql-in-statement/
Quote:
Вот как это сделать правильно:
Метод
setParameters
возьмет данный массив и должным образом взорвет его, чтобы использовать в операторе «IN».источник
:userids
)Я предпочитаю:
источник
Также работает с:
источник
Я боролся с тем же сценарием, когда мне приходилось делать запрос к массиву значений.
У меня сработало следующее:
http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/dql-doctrine-query-language.html#where-clause
Пример данных массива (работает со строками и целыми числами):
Пример запроса (адаптируйтесь к нужному месту):
источник
Это годы спустя, когда я работаю над устаревшим сайтом ... За всю жизнь я не мог заставить работать
->andWhere()
или->expr()->in()
решения.Наконец, заглянул в репозиторий Doctrine mongodb-odb и нашел несколько очень показательных тестов:
У меня это сработало!
Вы можете найти тесты на github здесь . Полезно для выяснения всякой чуши.
Примечание. Насколько я могу понять, в моей настройке используется Doctrine MongoDb ODM v1.0.dev.
источник