Как использовать andWhere и orWhere в доктрине?
WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2)
как я могу сделать это в учении?
$q->where("a = 1");
$q->andWhere("b = 1")
$q->orWhere("b = 2")
$q->andWhere("c = 1")
$q->orWhere("d = 2")
это не правильно... Должно быть:
$q->where("a = 1");
$q->andWhere("b = 1")
$q->orWhere("b = 2")
$q->andWhere("c = 1")
$q->orWhere("d = 2")
но как я могу это сделать? В Propel есть функция getNewCriterion, и в учении...?
4 ответов:
QueryBuilder:$qb->where('o.foo = 1') ->andWhere($qb->expr()->orX( $qb->expr()->eq('o.bar', 1), $qb->expr()->eq('o.bar', 2) )) ;это выражения, упомянутые в ответе Czechnology.
почему бы просто не
$q->where("a = 1"); $q->andWhere("b = 1 OR b = 2"); $q->andWhere("c = 1 OR d = 2");EDIT: вы также можете использовать Expr class (использует Doctrine2).
здесь не хватает одного: если у вас есть различное количество элементов, которые вы хотите собрать во что-то вроде
WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%')и не хотите собирать DQL-строку самостоятельно, вы можете использовать
orXупоминалось выше так:$patterns = ['abc', 'def']; $orStatements = $qb->expr()->orX(); foreach ($patterns as $pattern) { $orStatements->add( $qb->expr()->like('field', $qb->expr()->literal('%' . $pattern . '%')) ); } $qb->andWhere($orStatements);
Comments