Операторы OR и AND для db_select в Drupal 7

Последовательный вызов методов condition() для построения запросов в Drupal 7 функцией db_select() использует логический оператор AND. Для логического оператора OR между условиями используется функция db_or(). Для примера сделаем выборку материалов из таблицы node, которые имеют status=0(неопубликованные) или же у которых автор с uid=1.


$query = db_select('node', 'n') ;
$query->fields('n', array('nid', 'title'));
$db_or = db_or()
  ->condition('n.uid', 1)
  ->condition('n.status', 0);
$query->condition($db_or);
$result = $query->execute()->fetchAllKeyed();

Для построения более сложных составных условий используется комбинация db_or() и db_and(). Для примера возьмем классическое составное условие ((A AND B) OR (C AND D)). Будем делать также выборку материалов из таблицы node, у которых автор с uid=1 и status=0 или же у которых автор с uid=2 и заголовок содержит подстроку 'test'.


$substing = 'test';
$query = db_select('node', 'n') ;
$query->fields('n', array('nid', 'title'));
$db_and1 = db_and()
  ->condition('n.uid', 1)
  ->condition('n.status', 0);
$db_and2 = db_and()
  ->condition('n.uid', 2)
  ->condition('n.title', '%' . db_like($substing) '%', 'LIKE');
$db_or = db_or()
  ->condition($db_and1)
  ->condition($db_and2);
$query->condition($db_or);
$result = $query->execute()->fetchAllKeyed();