在CreateQueryBuilder中附加到setParameters

时间:2016-09-04 14:17:43

标签: php mysql symfony doctrine-orm

我正在尝试这个

$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并在('my_var' => $my_var)时添加('All' == $my_var),是否有可能?

2 个答案:

答案 0 :(得分:2)

是的,您可以,但请确保在这种情况下使用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条消息:Too few parameters: the query defines 3 parameters but you only bound 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查询结果中。< / p>

答案 1 :(得分:0)

这个怎么样....

if ('All'== $my_var) {
     // your total query with parameter
} else{
    //query code and skip parameter
}