dashiwa / drupal8

Drupal8 features and examples
GNU General Public License v2.0
0 stars 0 forks source link

Database API #1

Open dashiwa opened 5 years ago

dashiwa commented 5 years ago
  1. https://www.drupal.org/docs/8/api/database-api/instantiating-a-connection-object

  2. https://www.drupal.org/docs/8/api/database-api/database-configuration"

  3. https://www.drupal.org/docs/8/api/database-api/static-queries

  4. https://www.drupal.org/docs/8/api/database-api/dynamic-queries

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Database%21database.api.php/function/hook_query_TAG_alter/8.6.x

https://www.drupal.org/docs/7/api/database-api/dynamic-queries/query-alteration-tagging

https://www.drupal.org/docs/8/api/database-api/merge-queries

https://www.drupal.org/docs/8/api/database-api/transactions

"https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Database%21database.api.php/group/schemaapi/8.6.x

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%21module.api.php/function/hook_install/8.6.x

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%21module.api.php/function/hook_uninstall/8.6.x

dashiwa commented 5 years ago

Лучший способ создать объект соединения - через контейнер сервисов.

$connection = \Drupal::service('database');

Это приведет к объекту соединения, который настроен на подключение к основной базе данных по умолчанию, как определено в конфигурации базы данных в settings.php.

В некоторых случаях объект соединения уже может быть доступен как член в текущем классе; например, многие плагины и службы имеют объект соединения.

dashiwa commented 5 years ago

Использование другого соединения

Если ваш сайт использует несколько баз данных, для запуска запроса в базе данных, отличной от стандартной, используйте . Например: Database::getConnection()

$connection = \Drupal\Core\Database\Database::getConnection('default', 'other_database');

Это обеспечит соединение с базой данных, определенной в $settings.php, как:

$databases['other_database']['default']

dashiwa commented 5 years ago

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

Ключ подключения

$databases['default'] // The database connection.

Ключ соединения - уникальный идентификатор для данного соединения с базой данных. Ключ подключения должен быть уникальным для данного сайта, и всегда должно быть соединение «по умолчанию», которое будет основной базой данных Drupal. На большинстве сайтов это будет единственное соединение.

dashiwa commented 5 years ago

цель

$databases['default']['default'] // The database target.

У данного ключа подключения должна быть одна или несколько целей. Цель - это база данных, которая может быть использована, если она доступна. Для каждого ключа подключения всегда должна быть задана цель «по умолчанию». Если запрошенная цель не определена, система будет тихо возвращаться к «умолчанию».

Основное назначение целей - первичная репликация. Целью «по умолчанию» является первичный SQL-сервер. Затем может быть определена одна или несколько целей «реплики»

dashiwa commented 5 years ago

синтаксис

Массив $ databases - это вложенный массив из не менее трех уровней. Первый уровень определяет ключи базы данных. Второй определяет целевые объекты базы данных.

$databases['default']['default'] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb',
  'username' => 'username',
  'password' => 'secret',
  'host' => 'localhost',
);
dashiwa commented 5 years ago

Реплицация

Для конфигурации первичной / реплики можно было бы определить следующее:

$databases['default']['default'] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb1',
  'username' => 'username',
  'password' => 'secret',
  'host' => 'dbserver1',
);
$databases['default']['replica'][] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb2',
  'username' => 'username',
  'password' => 'secret',
  'host' => 'dbserver2',
);
$databases['default']['replica'][] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb3',
  'username' => 'username',
  'password' => 'secret',
  'host' => 'dbserver3',
);

Это определение предоставляет единый сервер по умолчанию и два сервера «реплики».

dashiwa commented 5 years ago

Параметры PDO

$databases['default']['default'] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb',
  'username' => 'username',
  'password' => 'secret',
  'host' => 'dbserver1',
  'pdo' => array(PDO::ATTR_TIMEOUT => 2.0, PDO::MYSQL_ATTR_COMPRESS => 1),
);
dashiwa commented 5 years ago

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

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

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

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

Placeholders

$query = $connection->query("SELECT id, example FROM {mytable} WHERE created > :created", [
  ':created' => REQUEST_TIME - 3600,
]);
dashiwa commented 5 years ago

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

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

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

dashiwa commented 5 years ago

Параметры запроса

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

$result = $connection->query("SELECT id, example FROM {mytable}", [], [
  'target' => 'replica',
  'fetch' => PDO::FETCH_ASSOC,
]);
dashiwa commented 5 years ago

4 Любой динамический запрос выбора может быть «помечен» одной или несколькими строками. Эти теги служат для идентификации типа запроса, который, в свою очередь, позволяет изменять крючки, чтобы определить, нужно ли им принимать меры.