繁体   English   中英

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

[英]Symfony and Doctrine DQL query builder: how to use multiple setParameters inside if condition checks?

使用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,
        ]);
}

得到如下错误:

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

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

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

到目前为止我发现的这个问题最干净的解决方案是将所有参数包装在一个数组中,然后只调用一次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);
}

您可以逐个设置参数:

$qb
    ->setParameter('field1', $value1)
    ->setParameter('field2', $value2);

这样您就可以确保不使用setParameters覆盖其他参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM