Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

Введение в динамические запросы

08/05/2020, by maria

Динамические запросы относятся к запросам, которые динамически создаются 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.