首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Doctrine 2中使用WHERE IN

如何在Doctrine 2中使用WHERE IN
EN

Stack Overflow用户
提问于 2011-05-09 01:26:05
回答 13查看 217.2K关注 0票数 142

我有以下代码,它给出了错误:

代码语言:javascript
复制
Message: Invalid parameter number: number of bound variables does not match number of tokens 

代码:

代码语言:javascript
复制
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):

代码语言:javascript
复制
Array
(
    [0] => 566
    [1] => 569
    [2] => 571
)

DQL结果:

代码语言:javascript
复制
q = SELECT COUNT(r.id) FROM \My\Entity\Rating r WHERE r.winner IN('?1')
EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2011-06-12 09:50:44

在研究这个问题的过程中,我发现了一些对任何遇到同样问题并寻找解决方案的人都很重要的东西。

在最初的帖子中,下面这行代码:

代码语言:javascript
复制
$qb->add('where', $qb->expr()->in('r.winner', array('?1')));

将命名参数包装为数组会导致绑定参数数量问题。通过将其从数组包装中移除:

代码语言:javascript
复制
$qb->add('where', $qb->expr()->in('r.winner', '?1'));

此问题应得到解决。这在以前的Doctrine版本中可能是一个问题,但在最新的2.0版本中已修复。

票数 123
EN

Stack Overflow用户

发布于 2012-08-09 06:42:38

最简单的方法是将数组本身绑定为参数:

代码语言:javascript
复制
$queryBuilder->andWhere('r.winner IN (:ids)')
             ->setParameter('ids', $ids);
票数 384
EN

Stack Overflow用户

发布于 2014-05-21 19:36:05

对于完整的字符串解决方案

代码语言:javascript
复制
$qb->andWhere('foo.field IN (:string)');
$qb->setParameter('string', array('foo', 'bar'), \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
票数 71
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5929036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档