doctrine QueryBuilder -- Как передать параметр в подзапрос. expr->orX()

Как построить сложный подзапрос expr()->... смотри здесь.

Метод setParameter() нельзя включить в цепочку после добавления части подзапроса, т.к.

($qb->expr()->orX())->add()

не возвращает QueryBuilder-объект, чьим методом является setParameter().

Это создаёт проблему, когда мы заранее не знаем, передан ли тот или иной параметр в работу, и следовательно, будет ли добавлена соответствющая часть в подзапрос.

Тогда добавляем setParameter() отдельной строкой, вызываю его у того объекта, который ему нужен, и в том месте, где нам нужно:

    // Где-то в начале запроса мы создали QueryBuilder
    $qb = $this->getEntityManager()
        ->createQueryBuilder();
    
    // Дальше как-то создавали запрос
    // ...

    // Тут нам понадобился подзапрос
    $orX = $qb->expr()->orX();
                
    // Добавляем в него условия
    if (!empty($sum)) {
        $orX->add("s.sum = :sum");
        // сетим параметр также внутри <em>if</em>, во избежании использования необъявленных переменных
        $qb->setParameter('sum', $sum);
    }

    // Присоединяем подзапрос к основному запросу
    $query->andWhere($orX);

    // И получаем результат
    return $query->orderBy('s.id', 'ASC')
        // здесь уже не сетим параметры, т.к. сделали это выше
        ->getQuery()
        ->getResult();

Источник