2016-05-19 43 views
6

Używając Symfony i Doctrine z narzędziem do budowania zapytań DQL, muszę opcjonalnie dodać niektóre warunki WHERE z parametrami, z pewnymi sprawdzeniami stanu. Przykładowy kodKreator zapytań Symfony i Doctrine DQL: jak używać wielu setParameters wewnątrz, jeśli sprawdzane są warianty?

Pseudo:

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

się błędy takie jak:

Nieprawidłowa liczba parametrów: liczba zmiennych związanych nie pasuje liczbę żetonów

Za kilka parametrów: określa zapytania Parametry X, ale jesteś związany tylko Y

Zbyt wiele parametrów: zapytanie definiuje X parametry i jesteś związany Y

+0

w warunkach określonych w instrukcji if w jaki sposób przekazujesz wartość pola? prawdopodobnie masz pierwszeństwo nad pierwszym parametrem setparametru. – Matteo

+0

który był tylko przykładem, zobacz moją odpowiedź poniżej – ShinDarth

Odpowiedz

6

najczystsze rozwiązanie tego problemu znalazłem do tej pory, jest owinąć wszystkie parametry wewnątrz tablicy, a następnie wywołanie tylko raz metody setParameters(), sprawdzenie, czy istnieje co najmniej jeden parametr ustawić:

$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

Twój oryginalny kod wygląda na to, że powinien działać. Robię to cały czas, z wyjątkiem tego, że używam setParameter zamiast setParameters. Może spróbować użyć pojedynczych wywołań setParameter. Szkoda, że ​​trzeba rozbić organizację. – Cerad

0

można ustawić parametry jeden po drugim:

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

w ten sposób będziesz mieć pewność, że nie zastępują inne params z setParameters .

+0

nie działa w przypadku, gdy zgodnie z OP. – RichieHH

+0

@RichieHH - działa tam, gdzie w moim kodzie – luchaninov