将参数设置为int数组,以获取dbal查询构建器中的in语句将数组抛出字符串转换异常的情况

时间:2019-04-19 08:43:58

标签: symfony doctrine-orm doctrine query-builder dbal

我尝试在WHERE IN语句的dbal querybuilder中绑定参数[1,2]

我尝试将$qb->expr()->in()更改为字符串版本,但未做任何更改

创建QueryBuilder

$qb = $this->_em->getConnection()->createQueryBuilder()
            ->select('c.id AS id')
            ->from('category', 'c')
            ->andWhere($qb->expr()->in('c.id', ':categories'))->setParameter('categories', [1, 2], \Doctrine\DBAL\Connection::PARAM_INT_ARRAY);

执行:

$qb->execute()->fetchAll();

错误:Array to string conversion

期望将整数数组绑定到querybuilder语句

2 个答案:

答案 0 :(得分:1)

总是喜欢引用文档。

// Example - $qb->expr()->in('u.id', array(1, 2, 3))
// Make sure that you do NOT use something similar to $qb->expr()->in('value', array('stringvalue')) as this will cause Doctrine to throw an Exception.
// Instead, use $qb->expr()->in('value', array('?1')) and bind your parameter to ?1 (see section above)
public function in($x, $y); // Returns Expr\Func instance

来源:doctrine querybuilder docs

因此,从本质上讲,除非类别是数字,否则您必须用占位符填充数组并设置它们,或者如果它们是数字,则可以只使用示例。

答案 1 :(得分:-1)

我假设您有一个实体,该实体具有ManyToMany或ManyToOne和Category实体, 您可以只传递一个类别数组,如果这样正确地制作该数组,它应该可以工作:

qb = $this->_em->getConnection()->createQueryBuilder()
            ->select('c.id AS id')
            ->from('category', 'c')
     ->andWhere($qb->expr()->in('c.id',':categories'))->setParameter('categories', $categoriesArray);

否则,您可以通过内爆数组来尝试将setParameter与id数组一起使用:

qb = $this->_em->getConnection()->createQueryBuilder()
            ->select('c.id AS id')
            ->from('category', 'c')
            ->andWhere($qb->expr()->in('c.id', ':categories'))->setParameter('categories', implode(",",[1, 2]));