Введение в динамические запросы
Динамические запросы относятся к запросам, которые динамически создаются Drupal, а не предоставлены в виде явной строки запроса. Все запросы вставки, обновления, удаления и слияния должны быть динамическими. Выборочные запросы могут быть статическими или динамическими. Следовательно, «динамический запрос» обычно относится к динамическому запросу Select.
Примечание: в 90% случаев использования запроса select у вас будет статический запрос. Если в критическом пути производительности, вы должны использовать query() вместо select() по соображениям производительности. Используйте динамические запросы только в том случае, если части запроса различаются (пример: добавление условий WHERE в зависимости от контекста) или если они должны быть изменяемыми.
Все динамически создаваемые запросы создаются с использованием объекта запроса, запрашиваемого у соответствующего объекта подключения к базе данных. Как и в случае статических запросов, в подавляющем большинстве случаев для запроса объекта может использоваться процедурная оболочка. Однако последующие директивы запроса принимают форму методов, вызываемых для объекта запроса.
Запросы динамического выбора запускаются с использованием метода select() следующим образом:
$database = \Drupal::database(); $query = $database->select('mytable', 'mt', $options);
В этом случае mytable является базовой таблицей для запроса; первая таблица после оператора FROM. Обратите внимание, что вокруг него не должно быть скобок. Построитель запросов будет обрабатывать это автоматически. Второй параметр - это псевдоним таблицы. Если не указано, используется имя таблицы. Массив $options не является обязательным и идентичен массиву $options для статических запросов.
Значение, возвращаемое вызовом $ database->select(), является объектом типа Select. Поэтому тип значения в переменной $query после этого вызова является объектом типа Select. Этот объект имеет полный список методов, таких как fields(), joins() и group(), которые можно вызывать для дальнейшего определения запроса.
Динамические запросы выбора могут быть очень простыми или очень сложными. Ниже мы рассмотрим отдельные части, которые составляют простой запрос, а на следующих страницах мы рассмотрим более сложные методы, такие как объединения.
Большая картина
Вот сравнительно простой запрос таблицы пользователей.
Допустим, мы хотим создать динамический запрос, который примерно эквивалентен следующему статическому запросу:
$result = $database->query("SELECT uid, name, status, created, access FROM {users} u WHERE uid <> 0 LIMIT 50 OFFSET 0");
Динамический эквивалент начинается следующим образом:
// Create an object of type Select. $database = \Drupal::database(); $query = $database->select('users', 'u'); // Add extra detail to this query object: a condition, fields and a range. $query->condition('u.uid', 0, '<>'); $query->fields('u', ['uid', 'name', 'status', 'created', 'access']); $query->range(0, 50);
Это часто пишется с использованием сокращенного синтаксиса, который используется для одновременного вызова нескольких методов объекта $query. Поэтому приведенный выше код часто записывается следующим образом:
// Create an object of type Select. $query = $database->select('users', 'u'); // Add extra detail to this query object: a condition, fields and a range. $query->condition('u.uid', 0, '<>') ->fields('u', ['uid', 'name', 'status', 'created', 'access']) ->range(0, 50);
Действительно, код можно и часто упростить еще на один шаг, связав вызов $ database->select() напрямую с вызовами метода для результирующего объекта. Это дает:
// Create an object of type Select and directly add extra detail // to this query object: a condition, fields and a range. $query = $database->select('users', 'u') ->condition('u.uid', 0, '<>') ->fields('u', ['uid', 'name', 'status', 'created', 'access']) ->range(0, 50);
Это упрощенная форма запроса, используемая страницей администрирования пользователей, на которую можно ссылаться для дальнейшего изучения.
Выполнение запроса
Как только запрос построен, вызовите метод execute(), чтобы скомпилировать и запустить запрос.
$result = $query->execute();
Метод execute() вернет объект результирующего набора / оператора, идентичный объекту, возвращенному функцией $database>query(), и он может быть повторен или извлечен точно таким же образом:
$result = $query->execute(); foreach ($result as $record) { // Do something with each $record. }
Примечание. Будьте внимательны при использовании следующих методов с многоколоночным динамическим запросом:
Эти методы в настоящее время требуют числовых индексов столбцов (0, 1, 2 и т. д.), А не псевдонимов таблиц. Однако в настоящее время построитель запросов не гарантирует какой-либо определенный порядок для возвращаемых полей, поэтому столбцы данных могут быть не в том порядке, который вы ожидаете. В частности, выражения всегда добавляются после полей, даже если вы сначала добавляете их в свой запрос. (Эта проблема не относится к статическим запросам, которые всегда возвращают столбцы данных в указанном вами порядке.)
Отладка
Чтобы изучить запрос SQL, который объект запроса использует в определенной точке своего жизненного цикла, распечатайте объект запроса. Чтобы проверить аргументы, посмотрите на массив, возвращаемый методом arguments():
echo $query; print_r($query->__toString()); print_r($query->arguments());
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.