Урок 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();

В INSERT по прежнему можно использовать drupal_write_record()

vsesovety.info

Drupal работа с базой данных – правильная реализация

Drupal работа с базой данных

От автора: в Drupal работа с базой данных является важной составляющей использования данного движка. Но, а как насчет практической реализации?

Можно пока оставить

Понятно, что конфигурация – это тоже «архи важно». Вот только мало кто описывает все этапы использования СУБД в нашей CMS. Больше как-то «по закоулкам» и семимильными шагами. А начинающим нужен конкретный пример. Исправим это, и предоставим вариант реализации полностью.

Не буду озвучивать теорию о том, что в 7 Друпал начали применять специализировнной API для баз. С этим познакомитесь самостоятельно. А сейчас сделаем модуль для создания таблицы.

В нем должно быть три файла. Все они располагаются в отдельной папке по этому пути:

Drupal работа с базой данных

Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?

Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress

Узнать подробнее

То есть, в каталоге modules создайте папку с именем модуля. В первом файле (.INFO) хранится краткое описание модуля.

Drupal работа с базой данных

В .MODULE помещаются базовый функционал расширения. Например, с db select(). Но этот метод мы сегодня оставим в покое :)

. Поэтому данный файл останется пустым (запас на будущее).

Drupal работа с базой данных

Главная закваска происходит в .INSTALL. Здесь мы используем хук hook_schema для создания новой таблицы в базе движка. Таблица получится наипростейшая с двумя полями и первичным ключом.

Drupal работа с базой данных

Проверка реализации

Теперь заходим в админку движка, активируем с помощью настроек наш модуль.

Drupal работа с базой данных

Заходим в базу и проверяем наличие таблицы.

Drupal работа с базой данных

Ура! Она присутствует. Ссылка на архив с описанным примером.

Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?

Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress

Узнать подробнее

Курс по Drupal. Основы

Прямо сейчас посмотрите курс по Drupal!

Смотреть курс

webformyself.com

Урок 8. Работа с базой данных

Работа с базой данных — неотъемлемая часть разработки. Сегодня поговорим о том, что изменилось по этому поводу в восьмерке.

Содержание

Устаревшие функции

Нововведения коснулись функций для работы с базой данных (БД). Они все еще могут использоваться, но уже являются устаревшими и будут удалены в 9 версии. Если установлен и правильно настроен Code Sniffer, то эти функции будут зачеркнутые как deprecated. Ниже приведен список этих функций[1]:

Как видно из этого списка, практически все функции из файла /core/includes/database.inc являются устаревшими, кроме db_ignore_replica()[2].

Статические запросы

Статические запросы представлены двумя deprecated функциями: db_query()[3], db_query_range()[4]. Первая выполняет простые выборки, вторая — если необходимо указать диапазон выборки. С помощью данных функций рекомендуется выполнять простые запросы SELECT, которые не используют поиск по сущностям, их полям. Кроме того, есть существенное ограничение — синтаксис запроса может отличаться в различных типах баз данных, что в свою очередь негативно влияет на универсальность запроса.Есть несколько важных замечаний, которым необходимо следовать:

Примеры запроса с использованием 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 представлен следующими методами, с помощью которых следует выполнять запросы:

Динамические запросы

Динамические запросы позволяют абстрагироваться от конкретной базы данных. Т.е. запрос, написанный с помощью 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

видео Drupal 7: работа с базой данных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 7

soft-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


Prostoy-Site | Все права защищены © 2018 | Карта сайта