12.13. Работа с базой данных в Drupal 8

Главные вкладки

levmyshkin 7 августа 2019 в 20:09

Выполнять запросы к базе данных обычное дело в разработке модулей для друпал.

Можете добавить в закладку эту страницу, чтобы всегда иметь под рукой шпаргалку, как в Drupal 8 выполнять MySQL запросы select, insert, update, delete.

Select

Получить одно значение:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->addField('n', 'nid');
$query->condition('n.title', 'About Us');
$query->range(0, 1);
$nid = $query->execute()->fetchField();

Получить одну строку значений:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->range(0, 1);
$vegetable = $query->execute()->fetchAssoc();

Вы также можете использовать ->fetchObject(), ->fetchAll() чтобы получать данные в объекте, а не в массиве.

Использование LIKE в запросе

$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->condition('n.title', $query->escapeLike('About') . '%', 'LIKE');
$vegetable = $query->execute()->fetchAllKeyed();

Select-запрос с JOIN:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->addField('u', 'name');
$query->join('users_field_data', 'u', 'u.uid = n.uid');
$query->condition('n.type', 'page');
$vegetable = $query->execute()->fetchAllAssoc('nid');

Ниже примеры других запросов к БД insert, update, upsert и delete. Эти запросы могут быть полезны для работы с кастомными таблицами. Но лучше подумайте дважды прежде чем использовать кастомные таблицы. Лучше всего использовать API друпала или contrib'ные модули. Но если все же вы решили писать кастомные запросы к базе, то ниже вы найдете примеры.

Insert

$query = \Drupal::database()->insert('flood');
$query->fields([
  'event',
  'identifier'
]);
$query->values([
  'My event',
  'My indentifier'
]);
$query->execute();

Вы можете вызывать values() несколько раз, чтобы вставить несколько записей за раз.

Update

$query = \Drupal::database()->update('flood');
$query->fields([
  'identifier' => 'My new identifier'
]);
$query->condition('event', 'My event');
$query->execute();

Upsert

$query = \Drupal::database()->upsert('flood');
$query->fields([
  'fid',
  'identifier',
]);
$query->values([
  1,
  'My indentifier for upsert'
]);
$query->key('fid');
$query->execute();

Метод key() должен быть использован для описания имени поля, которое будет использовано для определения существующей записи. То есть вам не нужно писать condition(), вы можете использовать метод key(). Поле используемое в методе key() должно быть уникальным, например как nid, uid, tid, fid или другие id сущностей. Если ключа не будет существовать, то вместо обновления записи, произойдет вставка новой записи с указанным ключом.

Delete

$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();

Вот собственно и все. Если вам нужно больше примеров пишите в комментариях. В следующих уроках мы разберем как использовать кастомные запросы к БД Drupal на практике.

Атрибуция

Абраменко Иван

Автор

Комментарии

Аватар пользователя Grenuy Grenuy 15 февраля 2021 в 1:48

Не хватает еще чистого запроса к БД
Редко, но нужно(вот я хочу обновлять 15 000 записей прямыми запросами) гуглу как его сделать в 8ке.