2016-05-19 41 views
6

Utilizzando Symfony e Doctrine con il generatore di query DQL, ho bisogno di aggiungere alcune condizioni WHERE con i parametri, con alcuni se i controlli delle condizioni. CodiceGeneratore di query Dfph di Symfony e Doctrine: come utilizzare più setParameters all'interno se le condizioni vengono controllate?

Pseudo esempio:

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

Come errori come:

numero di parametro non valido: numero di variabili vincolate non corrisponde al numero di gettoni

Parametri insufficienti: le definisce di query Parametri X, ma legato solo a Y

Troppi parametri: la query definisce X parametri e si tenuti Y

+0

nelle condizioni where dell'istruzione if come si passa il valore del campo? probabilmente si sostituisce il primo setparameter. – Matteo

+0

che era solo un esempio, vedere la mia risposta sotto – ShinDarth

risposta

6

la soluzione più pulita a questo problema che ho trovato finora, è quello di avvolgere tutti i parametri all'interno di una matrice e quindi chiamando solo una volta il metodo setParameters(), controllando se v'è almeno un parametro per impostare:

$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

Il tuo codice originale sembra che dovrebbe funzionare. Lo faccio tutto il tempo tranne che uso setParameter invece di setParameters. Potrebbe provare a utilizzare singole chiamate setParameter. È un peccato dover rompere l'organizzazione. – Cerad

0

È possibile impostare i parametri uno per uno:

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

In questo modo sarete sicuri di non ignorare gli altri params con setParameters .

+0

non funziona con dove secondo l'OP. – RichieHH

+0

@RichieHH - funziona con dove nel mio codice – luchaninov