Symfony和Doctrine DQL查询构建器:如果条件检查,如何在内部使用多个setParame?

Fra*_*rzi 7 php doctrine dql symfony doctrine-orm

使用Symfony和Doctrine与DQL查询构建器,我需要选择添加一些带参数的WHERE条件,以及一些if条件检查.

伪代码示例:

$qb = $this->getEntityManager()->createQueryBuilder();
$qb = $qb
    ->select('SOMETHING')
    ->from('SOMEWHERE')
    ->where('SOME CONDITIONS');


if ( SOME CHECK ) {
    $qb
        ->andWhere('field1 = :field1')
        ->andWhere('field2 = :field2')
        ->setParameters([
            'field1' => $myFieldValue1,
            'field2' => $myFieldValue2,
        ]);
} else {
    $qb
        ->andWhere('field1 = :field1')
        ->setParameters([
            'field1' => $myOtherFieldValue1,
        ]);
}
Run Code Online (Sandbox Code Playgroud)

得到如下错误:

参数号无效:绑定变量数与令牌数不匹配

参数太少:查询定义X参数但您只绑定Y.

参数太多:查询定义X参数,您绑定Y.

Fra*_*rzi 7

到目前为止我发现的这个问题最干净的解决方案是将所有参数包装在一个数组中,然后只调用一次该setParameters()方法,检查是否至少要设置一个参数:

$qb = $this->getEntityManager()->createQueryBuilder();
$qb = $qb
    ->select('SOMETHING')
    ->from('SOMEWHERE')
    ->where('SOME CONDITIONS')

$parameters = [];

if ( SOME CHECK ) {
    $qb
        ->andWhere('field1 = :field1')
        ->andWhere('field2 = :field2');

    $parameters['field1'] = $myFieldValue1;
    $parameters['field2'] = $myFieldValue2;

} else {
    $qb->andWhere('field1 = :field1');
    $parameters['field1'] = $myOtherFieldValue1;
}

if (count($parameters)) {
    $qb->setParameters($parameters);
}
Run Code Online (Sandbox Code Playgroud)