Конструирование запросов через Drupal DB API необходимо для поддержки совместимости кода для разных источников данных.
Друпал предоставляет и более прямые средства для написания запросов вроде db_query, и никто не может запретить вам применить функционал нативных php библиотек, но использование таких подходов может потребовать переписать код программы при смене одного движка баз данных на другой.
Здесь я хотел бы показать всего лишь один элемент использования конструктора, а именно формирование OR связей между двумя и более условиями.
Рассмотрим простой запрос db_select к таблице node :
1 2 3 4 5 6 |
$query = db_select("node", 'n'); $query= $query->fields('n', array('nid', 'title')) ->condition('n.status', NODE_PUBLISHED) ->condition('n.type', 'event') ->execute() ->fetchAll(); |
Запрос пытается выбрать статьи типа event, которые опубликованы. Оба условия связаны между собой логическим AND.
Как теперь, например, расширить список типов публикаций в условии, добавив туда ‘news’?
DB_OR
Можно воспользоваться специальным конструктором db_or().
1 2 3 |
$or = db_or(); $or->condition('n.type', 'event'); $or->condition('n.type', 'news'); |
Условия внутри этой коллекции связаны по OR. Осталось подставить это в наш прежний запрос.
1 2 3 4 5 |
$query= $query->fields('n', array('nid', 'title')) ->condition('n.status', NODE_PUBLISHED) ->condition($or) ->execute() ->fetchAll(); |
Полученное условие выглядит так:
1 |
.. WHERE status = NODE_PUBLISHED AND (type = 'event' OR type = 'news') |
Частный случай
В рассмотренном частном случае было бы правильно использовать другую возможность.
1 2 3 4 5 |
$query= $query->fields('n', array('nid', 'title')) ->condition('n.status', NODE_PUBLISHED) ->condition('n.type', array('news', 'event')) ->execute() ->fetchAll(); |
В такой записи будет использован SQL оператор IN, что равнозначно объединению по OR для каждого отдельного значения.
1 |
.. WHERE status = NODE_PUBLISHED AND (type IN ('event', 'news')) |