Comment utiliser andWhere et orWhere dans la Doctrine?
WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2)
Comment puis-je faire cela dans la 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 est la fonction getNewCriterion , et dans la Doctrine...?
54
demandé sur
halfer
2012-02-01 15:37:54
4 réponses
$q->where("a = 1")
->andWhere("b = 1 OR b = 2")
->andWhere("c = 2 OR c = 2")
;
85
répondu
Maerlyn
2013-06-07 08:26:13
Voici un exemple pour ceux qui ont des conditions plus compliquées et qui utilisent la 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 Czechnology.
47
répondu
sergekv
2016-05-02 16:20:41
Pourquoi ne pas simplement
$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).
11
répondu
Czechnology
2012-02-01 14:27:03
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);
1
répondu
leberknecht
2018-02-21 13:02:57