2016-05-19 2 views
6

Mit Symfony und Doctrine mit dem DQL-Abfrage-Generator muss ich einige WHERE-Bedingungen optional mit Parametern hinzufügen, mit einigen If-Bedingungsprüfungen.Symfony und Doctrine DQL-Abfrage-Generator: Wie verwendet man mehrere setParameters innerhalb von Zustandsprüfungen?

Pseudo-Code Beispiel:

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

Erste Fehler wie:

Ungültige Parameternummer: die Abfrage definiert: Anzahl der gebundenen Variablen Anzahl von Token nicht

Zu wenige Parameter entsprechen X-Parameter, aber Sie nur gebunden Y

Zu viele Parameter: die Abfrage definiert X Parameter und Sie gebunden Y

+0

in den Bedingungen, die aus der if-Anweisung hervorgehen, wie übergeben Sie den Feldwert? wahrscheinlich überschreiben Sie den ersten Set-Parameter. – Matteo

+0

das war nur ein Beispiel, siehe meine Antwort unter – ShinDarth

Antwort

6

die sauberste Lösung für dieses Problem, das ich bisher gefunden habe, ist es, alle Parameter innerhalb eines Arrays zu wickeln und ruft dann nur einmal die setParameters() Methode überprüft, ob es zumindest ein Parameter einstellen:

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

Ihr ursprünglicher Code sieht aus wie es funktionieren sollte. Ich mache es die ganze Zeit, außer dass ich setParameter anstelle von setParameters verwende. Könnte versuchen, einzelne setParameter-Aufrufe zu verwenden. Es ist eine Schande, die Organisation aufbrechen zu müssen. – Cerad

0

Sie können Parameter eingestellt eins nach dem anderen:

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

So können Sie sicher sein werden, dass Sie nicht andere params Sie außer Kraft setzen mit setParameters .

+0

funktioniert nicht mit wo wie im OP. – RichieHH

+0

@RichieHH - es funktioniert mit wo in meinem Code – luchaninov

Verwandte Themen