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

13,380

Solution 1

the cleanest solution to this problem I've found so far, is to wrap all the parameters inside an array and then calling only once the setParameters() method, checking if there is at least one parameter to set:

$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);
}

Solution 2

You can set parameters one by one:

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

This way you'll be sure that you don't override other params with setParameters.

Share:
13,380
Francesco Borzi
Author by

Francesco Borzi

https://github.com/FrancescoBorzi

Updated on June 19, 2022

Comments

  • Francesco Borzi
    Francesco Borzi almost 2 years

    Using Symfony and Doctrine with the DQL query builder, I need to optionally add some WHERE conditions with parameters, with some if condition checks.

    Pseudo code example:

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

    Getting errors like:

    Invalid parameter number: number of bound variables does not match number of tokens

    Too few parameters: the query defines X parameters but you only bound Y

    Too many parameters: the query defines X parameters and you bound Y

  • Cerad
    Cerad almost 8 years
    Your original code looks like it should work. I do it all the time except I use setParameter instead of setParameters. Might try using individual setParameter calls. It's a shame to have to break up the organization.
  • Piotr Stefański
    Piotr Stefański over 2 years
    I think it's better solution than the accepted.