在我开始之前,我相信我已经尝试了上一篇文章中的所有内容:How to use WHERE IN with Doctrine 2
所以我有一个 Silex 应用程序通过 composer (doctrine/dbal 2.2.*) 使用 Doctrine 连接到 MySQL DB
我尝试运行的查询生成器是这样的:
$qb = $this->db->createQueryBuilder();
$stmt = $qb->select('DAY(datefield1) x, COUNT(*) value')
->from('table1', 's')
->join('s', 'table2', 't', 't.key=s.key')
->where('MONTH(datefield1) = :billMonth')
->andWhere('YEAR(datefield1) = :billYear')
->andWhere('t.key IN (:keylist)')
->groupBy('x')
->orderBy('x', 'asc')
->setParameter(':billMonth', $month)
->setParameter(':billYear', $year)
->setParameter(':keylist', implode(",", $keylist))
->execute();
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
参数为(month=8)(year=2014)(keylist=array(1,2,3,4))
查询没有失败,但奇怪的是它没有包含它应该包含的所有数据。
我试过 ->setParameter(':keylist', $keylist) 来使用原始数组,但这没有用。
我也尝试过这种语法:
$qb->add('where', $qb->expr()->in('r.winner', array('?1')));
但是这会引发错误,因为 in 方法在表达式构建器类中不可用。
请有人关注一下,让我不必对 SQL 进行硬编码?
最佳答案
好吧,自从我上次查看以来,这个旧线程已经看到了一些 Action ,我想确认这个问题早已解决 - setParameter 中的第三个参数允许您通知 Doctrine 如何处理数组:
$qb = $this->db->createQueryBuilder();
$stmt = $qb
->select('*')
->from(self::DB_TABLE, 'x')
->where('x.service IN (:services)')
->orderBy('x.session_end', 'DESC')
->addOrderBy('x.direction', 'DESC')
->setParameter(':services', $services, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
->setFirstResult($offset)
->setMaxResults($count)
->execute();
$result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
关于php - Doctrine 哪里有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25791282/