我正在尝试这个
$results = this->get('doctrine')->getManager()->createQueryBuilder()
->select('x.a, x.b')
->from('mytable', 'x');
$results->where('AND x.d = :d');
if ('All' == $my_var) {
$results->andWhere('x.a IN (:my_var)')
}
$results->setParameters(
array(
'd' => $var_d,
)
);
现在我想附加 setParameters
并在 ('All' == $my_var)
时添加 ('my_var' => $my_var)
>,是否可行?
最佳答案
是的,你可以,但在这种情况下请确保使用 setParameter
而不是 setParameters
,因为 setParameters
会忽略先前的参数设置。
错误示例:
$qb->where('entity.foo = :foo');
$qb->setParameter('foo', $foo); // this param will be ignored after setParameters is called.
// ...
$qb->andWhere('entity.bar = :bar AND entity.baz = :baz')
$qb->setParameters(array('bar' => $bar, 'baz' => $baz)); // wrong statement.
return $qb->getQuery()->getResult();
这会抛出一条 QueryException
消息:参数太少:查询定义了 3 个参数,但您只绑定(bind)了 2 个
。
很好的例子:
$qb->where('entity.foo = :foo');
$qb->setParameter('foo', $foo);
// ...
$qb->andWhere('entity.bar = :bar AND entity.baz = :baz')
$qb->setParameter('bar', $bar);
$qb->setParameter('baz', $baz);
// or setting all parameters to end
$qb->setParameters(array('foo' => $foo, 'bar' => $bar, 'baz' => $baz));
return $qb->getQuery()->getResult();
在您的情况下:
$results = this->get('doctrine')->getManager()->createQueryBuilder()
->select('x.a, x.b')
->from('mytable', 'x');
$results->where('x.d = :d')->setParameter('d', $var_d);
if ('All' === $my_var) {
$results->andWhere('x.a IN (:my_var)')->setParameter('my_var', $my_var);
}
注意:在您的代码中 $results->where('AND x.d = :d');
并记住使用 where
/andWhere
语句,它们已经将 AND
添加到 sql 查询结果中。
关于php - 附加到 CreateQueryBuilder 中的 setParameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39317871/