我有以下代码,它给出了错误:
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')
发布于 2011-06-12 09:50:44
在研究这个问题的过程中,我发现了一些对任何遇到同样问题并寻找解决方案的人都很重要的东西。
在最初的帖子中,下面这行代码:
$qb->add('where', $qb->expr()->in('r.winner', array('?1')));
将命名参数包装为数组会导致绑定参数数量问题。通过将其从数组包装中移除:
$qb->add('where', $qb->expr()->in('r.winner', '?1'));
此问题应得到解决。这在以前的Doctrine版本中可能是一个问题,但在最新的2.0版本中已修复。
发布于 2012-08-09 06:42:38
最简单的方法是将数组本身绑定为参数:
$queryBuilder->andWhere('r.winner IN (:ids)')
->setParameter('ids', $ids);
发布于 2014-05-21 19:36:05
对于完整的字符串解决方案
$qb->andWhere('foo.field IN (:string)');
$qb->setParameter('string', array('foo', 'bar'), \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
https://stackoverflow.com/questions/5929036
复制相似问题