Урок 8. Работа с базой данных. Работа с базой данных drupal
Drupal 7: работа с базой данных
В своем стремлении к абстракции от конкретной БД разработчики Drupal, похоже, неплохо так выворачивают извилины. Разработчикам модулей приходится тоже изворачиваться. Ниже приведены отличия в запросах к БД между 6-й и 7-й версиями Drupal.
Теперь различают статический запрос (static query) и динамический запрос (dynamic query). Примеры приведены ниже.
Обычно методы запроса возвращают объект SelectQuery, что позволяет использовать цепочку вызовов вроде db_select()->method1()->method2().
//**** выборка всех значений по условию, в результате получаем массив объектов //**** затем используем foreach ($nodes as $node) { ... } //**** в особо ответственных случаях необходимо использовать addTag('node_access') //**** для проверки прав на исполнение этого запроса // Drupal 6 $nodes = db_query("SELECT nid, title FROM {node} WHERE type = '%s' AND uid = %d", 'page', 1); // Drupal 7, статический запрос $nodes = db_query(" SELECT nid, title FROM {node} WHERE type = :type AND uid = :uid ", array(':type' => 'page', ':uid' => 1))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n', array('nid', 'title')) ->condition('n.type', 'page') ->condition('n.uid', 1) ->addTag('node_access') ->execute() ->fetchAll(); //**** получение единственной записи // Drupal 6 $title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", 123)); // Drupal 7, статический запрос $title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchField(); // Drupal 7, динамический запрос $title = db_select('node', 'n') ->fields('n', array('title')) ->condition('n.nid', 123) ->execute() ->fetchField(); //**** получение объекта по его id // Drupal 6 $node = db_fetch_object(db_query("SELECT * FROM {node} WHERE nid = %d", 123)); // Drupal 7, статический запрос $node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchObject(); // Drupal 7, динамический запрос $node = db_select('node', 'n') ->fields('n') ->condition('n.nid', 123) ->execute() ->fetchObject(); //**** использование INNER JOIN //**** Тут необходимо помнить, что некоторые методы (например джоины) не возвращают объект SelectQuery, //**** и поэтому их нельзя использовать в цепочке вызовов. // Drupal 6 $nodes = db_query("SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid"); // Drupal 7, статический запрос $nodes = db_query("SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid ")->fetchAll(); // Drupal 7, динамический запрос $query = db_select('node', 'n'); $query->innerJoin('users', 'u', 'n.uid = u.uid'); $query->fields('n', array('title')); $query->fields('u', array('name')); $nodes = $query->execute()->fetchAll(); //**** поиск минимального значения // Drupal 6 $min = db_result(db_query("SELECT MIN(fieldname) FROM {table}")); // Drupal 7, статический запрос $min = db_query("SELECT MIN(fieldname) FROM {table}")->fetchField(); // Drupal 7, динамический запрос $query = db_select('table'); $query->addExpression('MIN(fieldname)'); $min = $query->execute()->fetchField(); //**** выборка заданного количества записей // Drupal 6 $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10"); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10")->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->range(0, 10) ->execute() ->fetchAll(); //**** подсчет количества записей // Drupal 6 $count = db_result(db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")); // Drupal 7, статический запрос $count = db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")->fetchField(); // Drupal 7, динамический запрос, вариант 1 $count = db_select('node', 'n') ->condition('n.uid', 1) ->countQuery() ->execute() ->fetchField(); // Drupal 7, динамический запрос, вариант 2 $query = db_select('node'); $query->addExpression('COUNT(*)'); $count = $query->execute()->fetchField(); //**** использование логического оператора OR // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE uid = %d OR status = %d", 1, 0); // Drupal 7, статический зспрос $nodes = db_query("SELECT * FROM {node} WHERE uid = :uid OR status = :status", array(':uid' => 1, ':status' => 0))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition( db_or() ->condition('uid', 1) ->condition('status', 0) )->execute() ->fetchAll(); //**** использование оператора IN $nds = array(1, 2, 3); // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid IN (" . db_placeholders($nds) . ")", $nds); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE nid IN (:nds)", array(':nds' => $nds))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', $nds, 'IN') ->execute() ->fetchAll(); //**** использование оператора LIKE // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE title LIKE '%%%s%%'", 'substring'); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE title LIKE :title", array(':title' => '%' . db_like('substring') . '%'))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.title', '%' . db_like('substring') . '%', 'LIKE') ->execute() ->fetchAll(); //**** использование оператора BETWEEN // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN %d AND %d", 123, 456); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN :nid1 AND :nid2", array(':nid1' => 123, ':nid2' => 456))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', array(123, 456), 'BETWEEN') ->execute() ->fetchAll(); //**** сложные условия в WHERE: // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = %d", 2011); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = :created", array(':created' => 2011))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->where('YEAR(FROM_UNIXTIME(n.created)) = :created', array(':created' => 2011)) ->execute() ->fetchAll(); //**** проверка значения на NULL // Drupal 6, Drupal 7 статический запрос $result = db_query("SELECT * FROM {table} WHERE field IS NULL"); // Drupal 7, динамический запрос, вариант 1 $result = db_select('table', 't') ->fields('t') ->condition('t.field', NULL, 'IS NULL') ->execute(); // Drupal 7, динамический запрос, вариант 2 $result = db_select('table', 't') ->fields('t') ->isNull('t.field') ->execute(); //**** сортировка // Drupal 6 $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC"); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC")->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->orderBy('n.created', 'DESC') ->orderBy('n.title', 'ASC') ->execute() ->fetchAll();vsesovety.info
Drupal работа с базой данных – правильная реализация
От автора: в Drupal работа с базой данных является важной составляющей использования данного движка. Но, а как насчет практической реализации?
Можно пока оставить
Понятно, что конфигурация – это тоже «архи важно». Вот только мало кто описывает все этапы использования СУБД в нашей CMS. Больше как-то «по закоулкам» и семимильными шагами. А начинающим нужен конкретный пример. Исправим это, и предоставим вариант реализации полностью.
Не буду озвучивать теорию о том, что в 7 Друпал начали применять специализировнной API для баз. С этим познакомитесь самостоятельно. А сейчас сделаем модуль для создания таблицы.
В нем должно быть три файла. Все они располагаются в отдельной папке по этому пути:
Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?
Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress
Узнать подробнееТо есть, в каталоге modules создайте папку с именем модуля. В первом файле (.INFO) хранится краткое описание модуля.
В .MODULE помещаются базовый функционал расширения. Например, с db select(). Но этот метод мы сегодня оставим в покое
Главная закваска происходит в .INSTALL. Здесь мы используем хук hook_schema для создания новой таблицы в базе движка. Таблица получится наипростейшая с двумя полями и первичным ключом.
Проверка реализации
Теперь заходим в админку движка, активируем с помощью настроек наш модуль.
Заходим в базу и проверяем наличие таблицы.
Ура! Она присутствует. Ссылка на архив с описанным примером.
Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?
Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress
Узнать подробнееКурс по Drupal. Основы
Прямо сейчас посмотрите курс по Drupal!
Смотреть курсwebformyself.com
Урок 8. Работа с базой данных
Работа с базой данных — неотъемлемая часть разработки. Сегодня поговорим о том, что изменилось по этому поводу в восьмерке.
Содержание
Устаревшие функции
Нововведения коснулись функций для работы с базой данных (БД). Они все еще могут использоваться, но уже являются устаревшими и будут удалены в 9 версии. Если установлен и правильно настроен Code Sniffer, то эти функции будут зачеркнутые как deprecated. Ниже приведен список этих функций[1]:
- db_query — выполняет запрос для текущей активной базы данных.
- db_query_range — аналогично db_query, только с ограничением по диапазону выборки.
- db_query_temporary — выполняет SELECT строковый запрос и сохраняет результат во временную таблицу.
- db_insert — создает новую запись в конкретной таблице.
- db_merge — мержит результаты новой записи и старой, которая уже существовала в БД.
- db_update — обновляет запись в таблице.
- db_delete — удаляет запись из таблицы.
- db_truncate — очищает таблицу целиком от всех записей.
- db_select — выполняет SELECT запрос.
- db_transaction — создает транзакцию для текущей БД.
- db_set_active — устанавливает новую активную БД.
- db_escape_table — ограничивает имя динамической таблицы безопасными символами.
- db_escape_field — ограничивает имя динамического поля безопасными символами.
- db_like — подставляет символы, которые необходимы в шаблоне LIKE.
- db_driver — получает имя текущего активного драйвера БД.
- db_close — закрывает соединение с активной базой.
- db_next_id — получает следующий уникальный ID.
- db_or — устанавливает OR для всех переданных условий.
- db_and — устанавливает AND для всех переданных условий.
- db_xor — устанавливает XOR для всех переданных условий.
- db_condition — возвращает новое DatabaseCondition.
- db_create_table — создает таблицу в БД.
- db_field_names — возвращает массив имен филдов в виде ключ/индекс.
- db_index_exists — проверяет существование индекса в конкретной таблице.
- db_table_exists — проверяет существование таблицы в БД.
- db_field_exists — проверяет существование колонки в определенной таблице.
- db_find_tables — находит все таблицы, которые удовлетворяют поиску.
- db_rename_table — переименовывает таблицу.
- db_drop_table — удаляет таблицу.
- db_add_field — добавляет новые поле в таблицу.
- db_drop_field — удаляет поле из таблицы.
- db_field_set_default — устанавливает дефолтное значение для поля.
- db_field_set_no_default — устанавливает поле, которое не будет иметь дефолтного значения.
- db_add_primary_key — добавляет primary ключ.
- db_drop_primary_key — удаляет primary ключ.
- db_add_unique_key — добавляет уникальный ключ.
- db_drop_unique_key — удаляет уникальный ключ.
- db_add_index — добавляет индекс.
- db_drop_index — удаляет индекс.
- db_change_field — изменяет поле в таблице БД.
Как видно из этого списка, практически все функции из файла /core/includes/database.inc являются устаревшими, кроме db_ignore_replica()[2].
Статические запросы
Статические запросы представлены двумя deprecated функциями: db_query()[3], db_query_range()[4]. Первая выполняет простые выборки, вторая — если необходимо указать диапазон выборки. С помощью данных функций рекомендуется выполнять простые запросы SELECT, которые не используют поиск по сущностям, их полям. Кроме того, есть существенное ограничение — синтаксис запроса может отличаться в различных типах баз данных, что в свою очередь негативно влияет на универсальность запроса.Есть несколько важных замечаний, которым необходимо следовать:
- помещать имена таблиц в фигурные скобки {}. Это необходимо для корректного распознавания таблицы друпалом, т.к. если используются префиксы в базе данных, то конечное имя таблицы может не совпадать с ожидаемой.
- использовать плейсхолдеры вместо прямой подстановки переменных в запрос. Это позволит избежать SQL инъекций.
Примеры запроса с использованием deprecated функции
1 | $items = db_query('SELECT * FROM {watchdog} WHERE type=:type', [':type' => 'cron'])->fetchAll(); |
Тот же запрос с использованием класса Database
1 | $items = Database::getConnection()->query('SELECT * FROM {watchdog} WHERE type=:type', [':type' => 'cron'])->fetchAll(); |
Второй вариант, если необходимо выполнить запрос с параметром limit, например из предыдущего примера выберем первые 5 записей
1 | $items = db_query_range('SELECT * FROM {watchdog} WHERE type=:type', 0, 5, [':type' => 'cron'])->fetchAll(); |
С использованием класса Database
1 | $items = Database::getConnection()->queryRange('SELECT * FROM {watchdog} WHERE type=:type', 0, 5, [':type' => 'cron'])->fetchAll(); |
Работа с сущностями
Для работы с сущностями в БД есть специальный API — Entity Query API. API представлен следующими методами, с помощью которых следует выполнять запросы:
- \Drupal::entityQuery() — статический метод, который возвращает entity query объект.В качестве примера, получим все ноды с типом article.
1 2 3 $query = \Drupal::entityQuery('node'); $query->condition('type', 'article'); $results = $query->execute(); После выполнения запроса в переменной $results будет массив с vid в качестве ключей и nid в качестве значений.Загрузка объектов нод можно выполнить с помощью статического метода loadMultiple() класса Node
1 2 use Drupal\node\Entity\Node; $nodes = Node::loadMultiple($results); - \Drupal::entityQueryAggregate() — возвращает агрегированный объект для данного типа сущности. Пример агрегации комментариев по последней дате обновления
1 2 3 $query = \Drupal::entityQueryAggregate('comment'); $query->aggregate('changed', 'MAX'); $results = $query->execute(); В результате получим массив
Динамические запросы
Динамические запросы позволяют абстрагироваться от конкретной базы данных. Т.е. запрос, написанный с помощью abstraction layer для работы с MySQL, прекрасно отработает и на PostgreSQL, и с другой БД, если Друпал имеет соответствующий драйвер. Даже если его нет, его всегда можно написать:)Упрощенные функции для работы с БД (db_select, db_update, db_delete и т. д.) являются своего рода обертками и, как мы уже выяснили, будут удалены в Drupal 9.Рассмотрим несколько примеров динамических запросов.Выборка всех сообщений из таблицы watchdog с типом крон
1 2 3 4 | $query = Database::getConnection()->select('watchdog', 'w'); $query->fields('w', ['message']); $query->condition('w.type', 'cron'); $messages = $query->execute()->fetchAll(); |
Пример выборки данных из поискового индекса search_index модуля ядра Search с джойном на таблицу search_total
1 2 3 4 5 6 | $query = Database::getConnection()->select('search_index', 'si'); $query->fields('si'); $query->join('search_total', 'st', 'st.word = si.word'); $query->fields('st', ['count']); $query->range(0, 5); $result = $query->execute()->fetchAll(); |
Транзакции
Для того, чтобы создать транзакцию, нужно использовать простую запись[5]
1 | $transaction = Database::getConnection()->startTransaction(); |
Если по каким-либо причинам что-то пошло не так — вызываем ролбэк
1 | $transaction->rollBack(); |
Пример записи в кастомную в таблицу example с транзакцией и конструкцией try catch.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | use \Drupal\Core\Database\Database; $connection = Database::getConnection(); $transaction = $connection->startTransaction(); try { $query = $connection->insert('example'); $query->fields([ 'text', 'uid', ]); $query->values([ 'text' => 'example item', 'uid' => 1, ]); $query->execute(); } catch (\Exception $e) { $transaction->rollBack(); drupal_set_message($e->getMessage(), 'error'); } |
Внешние ключи (foreign keys)
Внешние ключи по-прежнему не работают в Drupal 8. Использование их в схеме носит исключительно информативный характер[6].
nightdevel.ru
Drupal 7: работа с базой данных
Главная » Новости
Опубликовано: 22.07.2018
3.4. Пoследние изменения в фaйле settings.phpВ своем стремлении к абстракции от конкретной БД разработчики Drupal, похоже, неплохо так выворачивают извилины. Разработчикам модулей приходится тоже изворачиваться. Ниже приведены отличия в запросах к БД между 6-й и 7-й версиями Drupal.
Теперь различают статический запрос (static query) и динамический запрос (dynamic query) . Примеры приведены ниже.
Обычно методы запроса возвращают объект SelectQuery, что позволяет использовать цепочку вызовов вроде db_select()->method1()->method2() .
//**** выборка всех значений по условию, в результате получаем массив объектов //**** затем используем foreach ($nodes as $node) { ... } //**** в особо ответственных случаях необходимо использовать addTag('node_access') //**** для проверки прав на исполнение этого запроса // Drupal 6 $nodes = db_query ( "SELECT nid, title FROM {node} WHERE type = '%s' AND uid = %d" , 'page' , 1 ) ; // Drupal 7, статический запрос $nodes = db_query ( " SELECT nid, title FROM {node} WHERE type = :type AND uid = :uid " , array ( ':type' = > 'page' , ':uid' = > 1 ) ) -> fetchAll ( ) ; // Drupal 7, динамический запрос $nodes = db_select ( 'node' , 'n' ) - > fields ( 'n' , array ( 'nid' , 'title' ) ) - > condition ( 'n.type' , 'page' ) - > condition ( 'n.uid' , 1 ) - > addTag ( 'node_access' ) - > execute ( ) - > fetchAll ( ) ; //**** получение единственной записи // Drupal 6 $title = db_result ( db_query ( "SELECT title FROM {node} WHERE nid = %d" , 123 ) ) ; // Drupal 7, статический запрос $title = db_query ( "SELECT title FROM {node} WHERE nid = :nid" , array ( ':nid' = > 123 ) ) -> fetchField ( ) ; // Drupal 7, динамический запрос $title = db_select ( 'node' , 'n' ) - > fields ( 'n' , array ( 'title' ) ) - > condition ( 'n.nid' , 123 ) - > execute ( ) - > fetchField ( ) ; //**** получение объекта по его id // Drupal 6 $node = db_fetch_object ( db_query ( "SELECT * FROM {node} WHERE nid = %d" , 123 ) ) ; // Drupal 7, статический запрос $node = db_query ( "SELECT * FROM {node} WHERE nid = :nid" , array ( ':nid' = > 123 ) ) -> fetchObject ( ) ; // Drupal 7, динамический запрос $node = db_select ( 'node' , 'n' ) - > fields ( 'n' ) - > condition ( 'n.nid' , 123 ) - > execute ( ) - > fetchObject ( ) ; //**** использование INNER JOIN //**** Тут необходимо помнить, что некоторые методы (например джоины) не возвращают объект SelectQuery, //**** и поэтому их нельзя использовать в цепочке вызовов. // Drupal 6 $nodes = db_query ( "SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid" ) ; // Drupal 7, статический запрос $nodes = db_query ( "SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid " ) -> fetchAll ( ) ; // Drupal 7, динамический запрос $query = db_select ( 'node' , 'n' ) ; $query -> innerJoin ( 'users' , 'u' , 'n.uid = u.uid' ) ; $query -> fields ( 'n' , array ( 'title' ) ) ; $query -> fields ( 'u' , array ( 'name' ) ) ; $nodes = $query -> execute ( ) -> fetchAll ( ) ; //**** поиск минимального значения // Drupal 6 $min = db_result ( db_query ( "SELECT MIN(fieldname) FROM {table}" ) ) ; // Drupal 7, статический запрос $min = db_query ( "SELECT MIN(fieldname) FROM {table}" ) -> fetchField ( ) ; // Drupal 7, динамический запрос $query = db_select ( 'table' ) ; $query -> addExpression ( 'MIN(fieldname)' ) ; $min = $query -> execute ( ) -> fetchField ( ) ; //**** выборка заданного количества записей // Drupal 6 $nodes = db_query ( "SELECT * FROM {node} LIMIT 0, 10" ) ; // Drupal 7, статический запрос $nodes = db_query ( "SELECT * FROM {node} LIMIT 0, 10" ) -> fetchAll ( ) ; // Drupal 7, динамический запрос $nodes = db_select ( 'node' , 'n' ) - > fields ( 'n' ) - > range ( 0 , 10 ) - > execute ( ) - > fetchAll ( ) ; //**** подсчет количества записей // Drupal 6 $count = db_result ( db_query ( "SELECT COUNT(*) FROM {node} n WHERE n.uid = 1" ) ) ; // Drupal 7, статический запрос $count = db_query ( "SELECT COUNT(*) FROM {node} n WHERE n.uid = 1" ) -> fetchField ( ) ; // Drupal 7, динамический запрос, вариант 1 $count = db_select ( 'node' , 'n' ) - > condition ( 'n.uid' , 1 ) - > countQuery ( ) - > execute ( ) - > fetchField ( ) ; // Drupal 7, динамический запрос, вариант 2 $query = db_select ( 'node' ) ; $query -> addExpression ( 'COUNT(*)' ) ; $count = $query -> execute ( ) -> fetchField ( ) ; //**** использование логического оператора OR // Drupal 6 $nodes = db_query ( "SELECT * FROM {node} WHERE uid = %d OR status = %d" , 1 , 0 ) ; // Drupal 7, статический зспрос $nodes = db_query ( "SELECT * FROM {node} WHERE uid = :uid OR status = :status" , array ( ':uid' = > 1 , ':status' = > 0 ) ) -> fetchAll ( ) ; // Drupal 7, динамический запрос $nodes = db_select ( 'node' , 'n' ) - > fields ( 'n' ) - > condition ( db_or ( ) - > condition ( 'uid' , 1 ) - > condition ( 'status' , 0 ) ) -> execute ( ) - > fetchAll ( ) ; //**** использование оператора IN $nds = array ( 1 , 2 , 3 ) ; // Drupal 6 $nodes = db_query ( "SELECT * FROM {node} WHERE nid IN (" . db_placeholders ( $nds ) . ")" , $nds ) ; // Drupal 7, статический запрос $nodes = db_query ( "SELECT * FROM {node} WHERE nid IN (:nds)" , array ( ':nds' = > $nds ) ) -> fetchAll ( ) ; // Drupal 7, динамический запрос $nodes = db_select ( 'node' , 'n' ) - > fields ( 'n' ) - > condition ( 'n.nid' , $nds , 'IN' ) - > execute ( ) - > fetchAll ( ) ; //**** использование оператора LIKE // Drupal 6 $nodes = db_query ( "SELECT * FROM {node} WHERE title LIKE '%%%s%%'" , 'substring' ) ; // Drupal 7, статический запрос $nodes = db_query ( "SELECT * FROM {node} WHERE title LIKE :title" , array ( ':title' = > '%' . db_like ( 'substring' ) . '%' ) ) -> fetchAll ( ) ; // Drupal 7, динамический запрос $nodes = db_select ( 'node' , 'n' ) - > fields ( 'n' ) - > condition ( 'n.title' , '%' . db_like ( 'substring' ) . '%' , 'LIKE' ) - > execute ( ) - > fetchAll ( ) ; //**** использование оператора BETWEEN // Drupal 6 $nodes = db_query ( "SELECT * FROM {node} WHERE nid BETWEEN %d AND %d" , 123 , 456 ) ; // Drupal 7, статический запрос $nodes = db_query ( "SELECT * FROM {node} WHERE nid BETWEEN :nid1 AND :nid2" , array ( ':nid1' = > 123 , ':nid2' = > 456 ) ) -> fetchAll ( ) ; // Drupal 7, динамический запрос $nodes = db_select ( 'node' , 'n' ) - > fields ( 'n' ) - > condition ( 'n.nid' , array ( 123 , 456 ) , 'BETWEEN' ) - > execute ( ) - > fetchAll ( ) ; //**** сложные условия в WHERE: // Drupal 6 $nodes = db_query ( "SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = %d" , 2011 ) ; // Drupal 7, статический запрос $nodes = db_query ( "SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = :created" , array ( ':created' = > 2011 ) ) -> fetchAll ( ) ; // Drupal 7, динамический запрос $nodes = db_select ( 'node' , 'n' ) - > fields ( 'n' ) - > where ( 'YEAR(FROM_UNIXTIME(n.created)) = :created' , array ( ':created' = > 2011 ) ) - > execute ( ) - > fetchAll ( ) ; //**** проверка значения на NULL // Drupal 6, Drupal 7 статический запрос $result = db_query ( "SELECT * FROM {table} WHERE field IS NULL" ) ; // Drupal 7, динамический запрос, вариант 1 $result = db_select ( 'table' , 't' ) - > fields ( 't' ) - > condition ( 't.field' , NULL , 'IS NULL' ) - > execute ( ) ; // Drupal 7, динамический запрос, вариант 2 $result = db_select ( 'table' , 't' ) - > fields ( 't' ) - > isNull ( 't.field' ) - > execute ( ) ; //**** сортировка // Drupal 6 $nodes = db_query ( "SELECT * FROM {node} ORDER BY created DESC, title ASC" ) ; // Drupal 7, статический запрос $nodes = db_query ( "SELECT * FROM {node} ORDER BY created DESC, title ASC" ) -> fetchAll ( ) ; // Drupal 7, динамический запрос $nodes = db_select ( 'node' , 'n' ) - > fields ( 'n' ) - > orderBy ( 'n.created' , 'DESC' ) - > orderBy ( 'n.title' , 'ASC' ) - > execute ( ) - > fetchAll ( ) ;В INSERT по прежнему можно использовать drupal_write_record()
Сoздaние сaйтa нa Drupal 7soft-hack.ru
Drupal 7: работа с базой данных
В своем стремлении к абстракции от конкретной БД разработчики Drupal, похоже, неплохо так выворачивают извилины. Разработчикам модулей приходится тоже изворачиваться. Ниже приведены отличия в запросах к БД между 6-й и 7-й версиями Drupal.
Теперь различают статический запрос (static query) и динамический запрос (dynamic query). Примеры приведены ниже.
Обычно методы запроса возвращают объект SelectQuery, что позволяет использовать цепочку вызовов вроде db_select()->method1()->method2().
//**** выборка всех значений по условию, в результате получаем массив объектов //**** затем используем foreach ($nodes as $node) { ... } //**** в особо ответственных случаях необходимо использовать addTag('node_access') //**** для проверки прав на исполнение этого запроса // Drupal 6 $nodes = db_query("SELECT nid, title FROM {node} WHERE type = '%s' AND uid = %d", 'page', 1); // Drupal 7, статический запрос $nodes = db_query(" SELECT nid, title FROM {node} WHERE type = :type AND uid = :uid ", array(':type' => 'page', ':uid' => 1))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n', array('nid', 'title')) ->condition('n.type', 'page') ->condition('n.uid', 1) ->addTag('node_access') ->execute() ->fetchAll(); //**** получение единственной записи // Drupal 6 $title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", 123)); // Drupal 7, статический запрос $title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchField(); // Drupal 7, динамический запрос $title = db_select('node', 'n') ->fields('n', array('title')) ->condition('n.nid', 123) ->execute() ->fetchField(); //**** получение объекта по его id // Drupal 6 $node = db_fetch_object(db_query("SELECT * FROM {node} WHERE nid = %d", 123)); // Drupal 7, статический запрос $node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchObject(); // Drupal 7, динамический запрос $node = db_select('node', 'n') ->fields('n') ->condition('n.nid', 123) ->execute() ->fetchObject(); //**** использование INNER JOIN //**** Тут необходимо помнить, что некоторые методы (например джоины) не возвращают объект SelectQuery, //**** и поэтому их нельзя использовать в цепочке вызовов. // Drupal 6 $nodes = db_query("SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid"); // Drupal 7, статический запрос $nodes = db_query("SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid ")->fetchAll(); // Drupal 7, динамический запрос $query = db_select('node', 'n'); $query->innerJoin('users', 'u', 'n.uid = u.uid'); $query->fields('n', array('title')); $query->fields('u', array('name')); $nodes = $query->execute()->fetchAll(); //**** поиск минимального значения // Drupal 6 $min = db_result(db_query("SELECT MIN(fieldname) FROM {table}")); // Drupal 7, статический запрос $min = db_query("SELECT MIN(fieldname) FROM {table}")->fetchField(); // Drupal 7, динамический запрос $query = db_select('table'); $query->addExpression('MIN(fieldname)'); $min = $query->execute()->fetchField(); //**** выборка заданного количества записей // Drupal 6 $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10"); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10")->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->range(0, 10) ->execute() ->fetchAll(); //**** подсчет количества записей // Drupal 6 $count = db_result(db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")); // Drupal 7, статический запрос $count = db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")->fetchField(); // Drupal 7, динамический запрос, вариант 1 $count = db_select('node', 'n') ->condition('n.uid', 1) ->countQuery() ->execute() ->fetchField(); // Drupal 7, динамический запрос, вариант 2 $query = db_select('node'); $query->addExpression('COUNT(*)'); $count = $query->execute()->fetchField(); //**** использование логического оператора OR // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE uid = %d OR status = %d", 1, 0); // Drupal 7, статический зспрос $nodes = db_query("SELECT * FROM {node} WHERE uid = :uid OR status = :status", array(':uid' => 1, ':status' => 0))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition( db_or() ->condition('uid', 1) ->condition('status', 0) )->execute() ->fetchAll(); //**** использование оператора IN $nds = array(1, 2, 3); // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid IN (" . db_placeholders($nds) . ")", $nds); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE nid IN (:nds)", array(':nds' => $nds))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', $nds, 'IN') ->execute() ->fetchAll(); //**** использование оператора LIKE // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE title LIKE '%%%s%%'", 'substring'); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE title LIKE :title", array(':title' => '%' . db_like('substring') . '%'))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.title', '%' . db_like('substring') . '%', 'LIKE') ->execute() ->fetchAll(); //**** использование оператора BETWEEN // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN %d AND %d", 123, 456); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN :nid1 AND :nid2", array(':nid1' => 123, ':nid2' => 456))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', array(123, 456), 'BETWEEN') ->execute() ->fetchAll(); //**** сложные условия в WHERE: // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = %d", 2011); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = :created", array(':created' => 2011))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->where('YEAR(FROM_UNIXTIME(n.created)) = :created', array(':created' => 2011)) ->execute() ->fetchAll(); //**** проверка значения на NULL // Drupal 6, Drupal 7 статический запрос $result = db_query("SELECT * FROM {table} WHERE field IS NULL"); // Drupal 7, динамический запрос, вариант 1 $result = db_select('table', 't') ->fields('t') ->condition('t.field', NULL, 'IS NULL') ->execute(); // Drupal 7, динамический запрос, вариант 2 $result = db_select('table', 't') ->fields('t') ->isNull('t.field') ->execute(); //**** сортировка // Drupal 6 $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC"); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC")->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->orderBy('n.created', 'DESC') ->orderBy('n.title', 'ASC') ->execute() ->fetchAll();В INSERT по прежнему можно использовать drupal_write_record()
252fwot.vsesovety.info
Drupal 7: работа с базой данных
В своем стремлении к абстракции от конкретной БД разработчики Drupal, похоже, неплохо так выворачивают извилины. Разработчикам модулей приходится тоже изворачиваться. Ниже приведены отличия в запросах к БД между 6-й и 7-й версиями Drupal.
Теперь различают статический запрос (static query) и динамический запрос (dynamic query). Примеры приведены ниже.
Обычно методы запроса возвращают объект SelectQuery, что позволяет использовать цепочку вызовов вроде db_select()->method1()->method2().
//**** выборка всех значений по условию, в результате получаем массив объектов //**** затем используем foreach ($nodes as $node) { ... } //**** в особо ответственных случаях необходимо использовать addTag('node_access') //**** для проверки прав на исполнение этого запроса // Drupal 6 $nodes = db_query("SELECT nid, title FROM {node} WHERE type = '%s' AND uid = %d", 'page', 1); // Drupal 7, статический запрос $nodes = db_query(" SELECT nid, title FROM {node} WHERE type = :type AND uid = :uid ", array(':type' => 'page', ':uid' => 1))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n', array('nid', 'title')) ->condition('n.type', 'page') ->condition('n.uid', 1) ->addTag('node_access') ->execute() ->fetchAll(); //**** получение единственной записи // Drupal 6 $title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", 123)); // Drupal 7, статический запрос $title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchField(); // Drupal 7, динамический запрос $title = db_select('node', 'n') ->fields('n', array('title')) ->condition('n.nid', 123) ->execute() ->fetchField(); //**** получение объекта по его id // Drupal 6 $node = db_fetch_object(db_query("SELECT * FROM {node} WHERE nid = %d", 123)); // Drupal 7, статический запрос $node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchObject(); // Drupal 7, динамический запрос $node = db_select('node', 'n') ->fields('n') ->condition('n.nid', 123) ->execute() ->fetchObject(); //**** использование INNER JOIN //**** Тут необходимо помнить, что некоторые методы (например джоины) не возвращают объект SelectQuery, //**** и поэтому их нельзя использовать в цепочке вызовов. // Drupal 6 $nodes = db_query("SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid"); // Drupal 7, статический запрос $nodes = db_query("SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid ")->fetchAll(); // Drupal 7, динамический запрос $query = db_select('node', 'n'); $query->innerJoin('users', 'u', 'n.uid = u.uid'); $query->fields('n', array('title')); $query->fields('u', array('name')); $nodes = $query->execute()->fetchAll(); //**** поиск минимального значения // Drupal 6 $min = db_result(db_query("SELECT MIN(fieldname) FROM {table}")); // Drupal 7, статический запрос $min = db_query("SELECT MIN(fieldname) FROM {table}")->fetchField(); // Drupal 7, динамический запрос $query = db_select('table'); $query->addExpression('MIN(fieldname)'); $min = $query->execute()->fetchField(); //**** выборка заданного количества записей // Drupal 6 $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10"); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10")->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->range(0, 10) ->execute() ->fetchAll(); //**** подсчет количества записей // Drupal 6 $count = db_result(db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")); // Drupal 7, статический запрос $count = db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")->fetchField(); // Drupal 7, динамический запрос, вариант 1 $count = db_select('node', 'n') ->condition('n.uid', 1) ->countQuery() ->execute() ->fetchField(); // Drupal 7, динамический запрос, вариант 2 $query = db_select('node'); $query->addExpression('COUNT(*)'); $count = $query->execute()->fetchField(); //**** использование логического оператора OR // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE uid = %d OR status = %d", 1, 0); // Drupal 7, статический зспрос $nodes = db_query("SELECT * FROM {node} WHERE uid = :uid OR status = :status", array(':uid' => 1, ':status' => 0))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition( db_or() ->condition('uid', 1) ->condition('status', 0) )->execute() ->fetchAll(); //**** использование оператора IN $nds = array(1, 2, 3); // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid IN (" . db_placeholders($nds) . ")", $nds); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE nid IN (:nds)", array(':nds' => $nds))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', $nds, 'IN') ->execute() ->fetchAll(); //**** использование оператора LIKE // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE title LIKE '%%%s%%'", 'substring'); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE title LIKE :title", array(':title' => '%' . db_like('substring') . '%'))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.title', '%' . db_like('substring') . '%', 'LIKE') ->execute() ->fetchAll(); //**** использование оператора BETWEEN // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN %d AND %d", 123, 456); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN :nid1 AND :nid2", array(':nid1' => 123, ':nid2' => 456))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', array(123, 456), 'BETWEEN') ->execute() ->fetchAll(); //**** сложные условия в WHERE: // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = %d", 2011); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = :created", array(':created' => 2011))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->where('YEAR(FROM_UNIXTIME(n.created)) = :created', array(':created' => 2011)) ->execute() ->fetchAll(); //**** проверка значения на NULL // Drupal 6, Drupal 7 статический запрос $result = db_query("SELECT * FROM {table} WHERE field IS NULL"); // Drupal 7, динамический запрос, вариант 1 $result = db_select('table', 't') ->fields('t') ->condition('t.field', NULL, 'IS NULL') ->execute(); // Drupal 7, динамический запрос, вариант 2 $result = db_select('table', 't') ->fields('t') ->isNull('t.field') ->execute(); //**** сортировка // Drupal 6 $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC"); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC")->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->orderBy('n.created', 'DESC') ->orderBy('n.title', 'ASC') ->execute() ->fetchAll();В INSERT по прежнему можно использовать drupal_write_record()
email.vsesovety.info
Drupal 7: работа с базой данных
В своем стремлении к абстракции от конкретной БД разработчики Drupal, похоже, неплохо так выворачивают извилины. Разработчикам модулей приходится тоже изворачиваться. Ниже приведены отличия в запросах к БД между 6-й и 7-й версиями Drupal.
Теперь различают статический запрос (static query) и динамический запрос (dynamic query). Примеры приведены ниже.
Обычно методы запроса возвращают объект SelectQuery, что позволяет использовать цепочку вызовов вроде db_select()->method1()->method2().
//**** выборка всех значений по условию, в результате получаем массив объектов //**** затем используем foreach ($nodes as $node) { ... } //**** в особо ответственных случаях необходимо использовать addTag('node_access') //**** для проверки прав на исполнение этого запроса // Drupal 6 $nodes = db_query("SELECT nid, title FROM {node} WHERE type = '%s' AND uid = %d", 'page', 1); // Drupal 7, статический запрос $nodes = db_query(" SELECT nid, title FROM {node} WHERE type = :type AND uid = :uid ", array(':type' => 'page', ':uid' => 1))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n', array('nid', 'title')) ->condition('n.type', 'page') ->condition('n.uid', 1) ->addTag('node_access') ->execute() ->fetchAll(); //**** получение единственной записи // Drupal 6 $title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", 123)); // Drupal 7, статический запрос $title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchField(); // Drupal 7, динамический запрос $title = db_select('node', 'n') ->fields('n', array('title')) ->condition('n.nid', 123) ->execute() ->fetchField(); //**** получение объекта по его id // Drupal 6 $node = db_fetch_object(db_query("SELECT * FROM {node} WHERE nid = %d", 123)); // Drupal 7, статический запрос $node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchObject(); // Drupal 7, динамический запрос $node = db_select('node', 'n') ->fields('n') ->condition('n.nid', 123) ->execute() ->fetchObject(); //**** использование INNER JOIN //**** Тут необходимо помнить, что некоторые методы (например джоины) не возвращают объект SelectQuery, //**** и поэтому их нельзя использовать в цепочке вызовов. // Drupal 6 $nodes = db_query("SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid"); // Drupal 7, статический запрос $nodes = db_query("SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid ")->fetchAll(); // Drupal 7, динамический запрос $query = db_select('node', 'n'); $query->innerJoin('users', 'u', 'n.uid = u.uid'); $query->fields('n', array('title')); $query->fields('u', array('name')); $nodes = $query->execute()->fetchAll(); //**** поиск минимального значения // Drupal 6 $min = db_result(db_query("SELECT MIN(fieldname) FROM {table}")); // Drupal 7, статический запрос $min = db_query("SELECT MIN(fieldname) FROM {table}")->fetchField(); // Drupal 7, динамический запрос $query = db_select('table'); $query->addExpression('MIN(fieldname)'); $min = $query->execute()->fetchField(); //**** выборка заданного количества записей // Drupal 6 $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10"); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} LIMIT 0, 10")->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->range(0, 10) ->execute() ->fetchAll(); //**** подсчет количества записей // Drupal 6 $count = db_result(db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")); // Drupal 7, статический запрос $count = db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = 1")->fetchField(); // Drupal 7, динамический запрос, вариант 1 $count = db_select('node', 'n') ->condition('n.uid', 1) ->countQuery() ->execute() ->fetchField(); // Drupal 7, динамический запрос, вариант 2 $query = db_select('node'); $query->addExpression('COUNT(*)'); $count = $query->execute()->fetchField(); //**** использование логического оператора OR // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE uid = %d OR status = %d", 1, 0); // Drupal 7, статический зспрос $nodes = db_query("SELECT * FROM {node} WHERE uid = :uid OR status = :status", array(':uid' => 1, ':status' => 0))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition( db_or() ->condition('uid', 1) ->condition('status', 0) )->execute() ->fetchAll(); //**** использование оператора IN $nds = array(1, 2, 3); // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid IN (" . db_placeholders($nds) . ")", $nds); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE nid IN (:nds)", array(':nds' => $nds))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', $nds, 'IN') ->execute() ->fetchAll(); //**** использование оператора LIKE // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE title LIKE '%%%s%%'", 'substring'); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE title LIKE :title", array(':title' => '%' . db_like('substring') . '%'))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.title', '%' . db_like('substring') . '%', 'LIKE') ->execute() ->fetchAll(); //**** использование оператора BETWEEN // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN %d AND %d", 123, 456); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE nid BETWEEN :nid1 AND :nid2", array(':nid1' => 123, ':nid2' => 456))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->condition('n.nid', array(123, 456), 'BETWEEN') ->execute() ->fetchAll(); //**** сложные условия в WHERE: // Drupal 6 $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = %d", 2011); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = :created", array(':created' => 2011))->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->where('YEAR(FROM_UNIXTIME(n.created)) = :created', array(':created' => 2011)) ->execute() ->fetchAll(); //**** проверка значения на NULL // Drupal 6, Drupal 7 статический запрос $result = db_query("SELECT * FROM {table} WHERE field IS NULL"); // Drupal 7, динамический запрос, вариант 1 $result = db_select('table', 't') ->fields('t') ->condition('t.field', NULL, 'IS NULL') ->execute(); // Drupal 7, динамический запрос, вариант 2 $result = db_select('table', 't') ->fields('t') ->isNull('t.field') ->execute(); //**** сортировка // Drupal 6 $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC"); // Drupal 7, статический запрос $nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC")->fetchAll(); // Drupal 7, динамический запрос $nodes = db_select('node', 'n') ->fields('n') ->orderBy('n.created', 'DESC') ->orderBy('n.title', 'ASC') ->execute() ->fetchAll();В INSERT по прежнему можно использовать drupal_write_record()
70647.vsesovety.info