• урок
  • pantey

Drupal 8 – Database API. Часть 2 – Основные запросы в БД

16.08.2017

Из предыдущего урока мы с вами научились создать и удалять таблицу в нашей БД, сегодня мы будем разбираться, как обращаться к БД.

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

Выборка единственной записи в строке с условием:

<?php

# Выборка единственной записи
$query = \Drupal::database()->select('users_field_data', 'ufd');
$query->addField('ufd', 'mail');
$query->condition('ufd.uid', 1);
$mail = $query->execute()->fetchField();

Где:

  • addField() – содержит название поля для выборки
  • condition() – условия выборки

Drupal_8_database_api_2.png

Выборка нескольких записей в строке с условием:

<?php

# Выборка нескольких записей
$query = \Drupal::database()->select('users_field_data', 'ufd');
$query->fields('ufd', array('langcode', 'name', 'mail', 'created'));
$query->condition('ufd.uid', 1);
$output = $query->execute()->fetchAssoc();

Где:

  • fields() – содержит массив с имена полей для выборки

Drupal_8_database_api_2_1.png

Выборка с сортировкой по полю:

<?php

# Выборка с сортировкой по полю
$query = \Drupal::database()->select('database_ex', 'de');
$query->fields('de', array('id', 'uid', 'text', 'timestamp'));
$query->orderBy('de.id', 'DESC');
$output = $query->execute()->fetchAll();

Где:

  • orderBy() – содержит имя поля, по которому необходимо сортировать и значение сортировки ASC, DESC

Выбрать определенное кол-во записей:

<?php

# Выбрать определенной кол-во записей
$query = \Drupal::database()->select('database_ex', 'de');
$query->fields('de', array('id', 'uid', 'text', 'timestamp'));
$query->orderBy('de.id', 'DESC');
$query->range(0, 1);
$output = $query->execute()->fetchAll();

Где:

  • range() – содержит значения для ограничения выборки. Например в данном случае, запись говорит, что нужно получить только первую запись

Использование db like:

<?php

# Использование db like
# с учётом того, что заголовок страницы имеет название "Контакты"
$query = \Drupal::database()->select('node_field_data', 'nfd');
$query->fields('nfd', array('nid', 'title', 'status', 'created'));
$query->condition('nfd.type', 'page');
$query->condition('nfd.title', $query->escapeLike('Ко') . '%', 'LIKE');
$output = $query->execute()->fetchAllKeyed();

Drupal_8_database_api_2_2.png

Использование JOIN:

<?php

$query = \Drupal::database()->select('node_field_data', 'nfd');
$query->fields('nfd', array('nid', 'title', 'status', 'created'));
$query->addField('ufd', 'name');
$query->addField('ufd', 'uid');
$query->join('users_field_data', 'ufd', 'ufd.uid = nfd.uid');
$query->condition('nfd.type', 'page');
$output = $query->execute()->fetchAllAssoc('nid');

Drupal_8_database_api_2_3.png

Вставка данных в таблицу БД:

<?php

# Вставка данных в таблицу БД
$query = \Drupal::database()->insert('database_ex');
$query->fields(array(
  'uid',
  'text',
  'timestamp',
));
$query->values(array(
  '1',
  'My custom text for example database',
  time(),
));
$query->execute();

Хочу заметить, что первоначально определяется массив из имен полей для вставки,а дальше массив значений для вставки.

Drupal_8_database_api_2_4.png

Обновление данных в таблице БД:

<?php

# Обновление данных в таблице БД
$query = \Drupal::database()->update('database_ex');
$query->fields(array(
  'text' => 'My custom new text from update'
));
$query->condition('id', 1);
$query->execute();

Drupal_8_database_api_2_5.png

Обновление данных в таблице БД, с проверкой на уникальность (существование) ключа:

<?php

# Обновление данных в таблице БД, с проверкой на уникальность ключа
$query = \Drupal::database()->upsert('database_ex');
$query->fields(array(
  'id',
  'uid',
  'text',
  'timestamp',
));
$query->values(array(
  1,
  1,
  'Upsert custom text',
  time(),
));
$query->key('id');
$query->execute();

Хочу заметить, что метод key() – должен использоваться для указания имени поля, которое будет использоваться для индентификации строки. Это поле должно иметь уникальное значение (например, с использованием автоинкримента), иначе upsert() будет использована как insert().

Удаление записи из БД:

<?php

# Удаление записи из БД
$query = \Drupal::database()->delete('database_ex');
$query->condition('id', '1');
$query->execute();

Использование статичного (static) запроса:

<?php

$query = db_query("SELECT * FROM {node} WHERE nid IN (1)");
$output = $query->fetchAll();

Это основной список запросов, которые вы будете использовать практически всегда при работе с БД. На этом можно закончить.

Скачать модуль используемый в примере

Скачать

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (1)

Profile picture for user 1541
nnnn
21.12.2017

Допустим я хочу выводит в блоке sid , я беру его из бд  и вывожу в блоке , но после логаута и повторного логина в блоке остается старый сид а в бд само собой он меняется