86 votes

Comment utiliser andWhere et orWhere dans Doctrine ?

WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2)

Comment puis-je faire cela dans Doctrine?

 $q->where("a = 1");
$q->andWhere("b = 1")
$q->orWhere("b = 2")
$q->andWhere("c = 1")
$q->orWhere("d = 2")

ce n'est pas correctement... Devrait être :

 $q->where("a = 1");
$q->andWhere("b = 1")
   $q->orWhere("b = 2")
$q->andWhere("c = 1")
   $q->orWhere("d = 2")

mais comment puis-je le faire? Dans Propel se trouve la fonction getNewCriterion , et dans Doctrine...?

130voto

Maerlyn Points 18190
$q->where("a = 1")
  ->andWhere("b = 1 OR b = 2")
  ->andWhere("c = 2 OR c = 2")
  ;

110voto

a2ad2d Points 716

Voici un exemple pour ceux qui ont des conditions plus compliquées et qui utilisent Doctrine 2.* avec QueryBuilder :

 $qb->where('o.foo = 1')
   ->andWhere($qb->expr()->orX(
      $qb->expr()->eq('o.bar', 1),
      $qb->expr()->eq('o.bar', 2)
   ))
  ;

Ce sont des expressions mentionnées dans la réponse de Czechnology.

25voto

leberknecht Points 587

Il manque une chose ici : si vous avez un nombre variable d'éléments que vous voulez assembler pour quelque chose comme

 WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%')

et ne voulez pas assembler vous-même une chaîne DQL, vous pouvez utiliser le orX mentionné ci-dessus comme ceci :

 $patterns = ['abc', 'def'];
$orStatements = $qb->expr()->orX();
foreach ($patterns as $pattern) {
    $orStatements->add(
        $qb->expr()->like('field', $qb->expr()->literal('%' . $pattern . '%'))
    );
}
$qb->andWhere($orStatements);

14voto

Czechnology Points 8031

Pourquoi pas juste

 $q->where("a = 1");
$q->andWhere("b = 1 OR b = 2");
$q->andWhere("c = 1 OR d = 2");

EDIT : Vous pouvez également utiliser la classe Expr (Doctrine2).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X