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

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

01/05/2020, by maria

Наиболее распространенные запросы SELECT в Drupal - это статические запросы с использованием метода query() объекта подключения к базе данных.
Статические запросы передаются в базу данных почти дословно.

Пример:

$database = \Drupal::database();
$query = $database->query("SELECT id, example FROM {mytable}");
$result = $query->fetchAll();

Только очень простые запросы SELECT должны использовать метод static query(). Вы должны использовать динамический запрос, если вам нужны более сложные запросы, динамическая генерация запросов или изменчивость.

Не используйте эту функцию для простых запросов INSERT, UPDATE или DELETE. Они должны обрабатываться через insert(), update() и delete() соответственно. Для более сложных запросов DELETE для нескольких таблиц см. Сложные запросы DELETE.

Аргументы

Метод query() объекта подключения к базе данных принимает три аргумента:

  • $query: запрос для запуска. При необходимости используйте заполнители и обозначайте все имена таблиц фигурными скобками.
  • $args: массив значений заполнителей для замены в запросе.
  • $options: массив параметров для управления работой запроса (необязательно).

Префикс имени таблицы

В статических запросах все имена таблиц должны быть заключены в фигурные скобки {...}.

Заключение имен таблиц в фигурные скобки помечает их так, чтобы система баз данных могла присоединить к ним строку префикса, если это необходимо. Префикс позволяет запускать несколько сайтов из одной базы данных или, в некоторых случаях, обмениваться выбранными таблицами между сайтами. Также необходимо избегать утечки данных с хост-сайта в тесты.

Заполнители

Заполнители отмечают, где литерал будет вставлен в запрос для выполнения. Отделяя их от самого запроса, мы позволяем базе данных различать синтаксис SQL и предоставленные пользователем значения, что позволяет избежать атак внедрения SQL.

$query = $database->query("SELECT id, example FROM {mytable} WHERE created > :created", [
  ':created' => REQUEST_TIME - 3600,
]);

Приведенный выше код выберет все mytable идентификаторы и примеры, созданные за последний час (3600 секунд). Заполнитель: созданный будет динамически заменен любым значением REQUEST_TIME - 3600 в момент выполнения запроса.

Запрос может иметь любое количество заполнителей, но все должны иметь уникальные имена, даже если они имеют одинаковое значение. В зависимости от варианта использования массив заполнителей может быть указан как встроенный (как указано выше) или может быть построен заранее и передан. Порядок массива не имеет значения.

Заполнители, начинающиеся с "db_", зарезервированы для внутреннего использования системой и никогда не должны указываться явно.

Обратите внимание, что заполнители не должны быть экранированы или заключены в кавычки независимо от их типа. Поскольку они передаются на сервер базы данных отдельно, сервер может самостоятельно различать строку запроса и значение.

// WRONG (quotes around the :type placeholder)
$result = $database->query("SELECT example FROM {mytable} WHERE type = ':type'", [
  ':type' => 'mytype',
]);

// CORRECT (no quotes around the :type placeholder)
$result = $database->query("SELECT example FROM {mytable} WHERE type = :type", [
  ':type' => 'mytype',
]);

Заполнители нельзя использовать для имен столбцов и таблиц. Вместо этого, если они получены из небезопасного ввода, они должны быть запущены через $database->escapeTable().

Массивы-заполнители

Уровень базы данных Drupal включает дополнительную функцию заполнителей. Если значение, переданное для заполнителя, является массивом, оно будет автоматически развернуто в список через запятую, как и соответствующий заполнитель. Это означает, что разработчикам не нужно беспокоиться о подсчете количества заполнителей, которые им понадобятся.

Пример должен прояснить это поведение:

$result = $database->query("SELECT * FROM {mytable} WHERE id IN (:ids[])", [':ids[]' => [13, 42, 144]]);

Следующие два утверждения оба эквивалентны утверждению выше:

$result = $database->query("SELECT * FROM {mytable} WHERE id IN (:ids_1, :ids_2, :ids_3)", [
  ':ids_1' => 13, 
  ':ids_2' => 42, 
  ':ids_3' => 144,
]);

$result = $database->query("SELECT * FROM {mytable} WHERE id IN (13, 42, 144)");

Варианты запросов

Третий параметр метода query() объекта подключения к базе данных - это массив опций, определяющих поведение запроса. Обычно есть только две директивы, которые будут использоваться большинством запросов. Другие значения в основном для внутреннего использования.

Ключ "target" указывает цель для использования. Если не указано, по умолчанию используется значение «по умолчанию». В настоящее время единственным другим допустимым значением является «реплика», чтобы указать, что запрос должен выполняться к серверу реплики, если таковой существует.

Ключ «fetch» ​​указывает, как будут получены записи, возвращенные из этого запроса. Допустимые значения: PDO::FETCH_OBJ, PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_BOTH или строка, представляющая имя класса. Если указана строка, каждая запись будет извлечена в новый объект этого класса. Поведение всех других значений определяется PDO и будет извлекать записи в виде объекта stdClass, ассоциативного массива, числового массива или массива с числовым и ассоциативным ключом соответственно. См. Http://php.net/manual/en/pdostatement.fetch.php. По умолчанию используется PDO::FETCH_OBJ, который для согласованности следует использовать, если только нет особой причины поступать иначе.

В следующем примере выполняется запрос к серверу реплики, если он доступен, и извлекаются записи из набора результатов в виде ассоциативного массива.

$result = $database->query("SELECT id, example FROM {mytable}", [], [
  'target' => 'replica',
  'fetch' => PDO::FETCH_ASSOC,
]);

Объект результата, возвращаемый вызовом метода query(), можно использовать для получения каждой возвращаемой строки, а затем столбца. В следующем примере переменная $result имеет все возвращенные строки запроса, а затем отдельные строки извлекаются по одной в переменную $row с помощью fetchAssoc():

$sql = "SELECT name, quantity FROM goods WHERE vid = :vid";
$result = $database->query($sql, [':vid' => $vid]);
if ($result) {
  while ($row = $result->fetchAssoc()) {
    // Do something with:
    // $row['name']
    // $row['quantity']
  }
}

Сложные запросы DELETE

Использование статического запроса - это простой и компактный способ выражения запроса на удаление, который включает удаление из нескольких таблиц в одном выражении.

Пример:

$database = \Drupal::database();
$database->query("DELETE {table1}, {table2} FROM {table1} INNER JOIN {table2} ON {table1}.id = {table2}.id WHERE {table1}.id=:recno", [":recno" => 2]);

(Удаляет строку как из таблицы1, так и из таблицы2)

Source URL:

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.