簡體   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