Сегодня будем разбираться с основами Database API в Drupal 8. База данных построена поверх PDO PHP, что предполагает возможность работы с разными базами данных. Начнем с основ, а именно как создать свою таблицу в базе данных.
Инициализация создания таблиц, в подавляющем большинстве случаев, происходит в момент активации модуля, а именно чтением файла - module_name.install
Как всегда, все действия рассматриваем на конкретном примере. Создадим модуль, в моем случае он будет называться database_ex.
Файл database_ex.info.yml
name: Database ex
description: Данный модуль демонстрирует использование Database API в Drupal 8
core: 8.x
package: Other
type: module
Далее создадим файл database_ex.install, в котором опишем создание таблицы, с необходимыми колонками и типами данных. Для этого используется хук:
<?php
module_name_schema()
Файл database_ex.install
<?php
/**
* @return mixed
* Implements hook_schema()
*/
function database_ex_schema() {
# Database example
$schema['database_ex'] = array( // Название таблицы
'description' => 'Database example', // Описание таблицы
'fields' => array( // Массив с колонками таблицы
'id' => array( // Название колонки
'description' => 'ID', // Описание колонки
'type' => 'serial', // Тип данных
'unsigned' => TRUE, // Unsigned, по умолчанию FALSE
'not null' => TRUE, // Проверка на 0
),
'uid' => array(
'description' => 'UID user',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0, // Значение по умолчанию
),
'text' => array(
'description' => 'Text',
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
),
'timestamp' => array(
'description' => 'Timestamp',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
),
),
'primary key' => array('id'),
);
return $schema;
}
Как вы можете видеть, мы создали таблицу с именем database_ex, которая содержит 4 колонки:
- id – используется для нумерации строк в таблице
- uid – будет использоваться для хранения UID пользователя
- text – будет использоваться для хранения текста
- timestamp – будет использоваться для хранения времени записи
Хочу заметить, что при создании таблицы, мы так же использовали ключ – primary key, которому в качестве параметра было передано название колонки, в данном случае id, - это означает, что для колонки id будет применен автоинкремент, т.е. при добавлении записи в таблицу - ключ, в данной колонке, будет увеличиваться автоматически и использовать в запросе добавления данных не нужно.
Существуют следующие типы данных:
- serial – колонка должна содержать только целое число, используется как правило, только для автоинкремента
- int – колонка должна содержать только целое число
- float – колонка должна содержать число с плавающей точкой
- numeric – колонка должна содержать числовое значение
- varchar – колонка используется для хранения строки
- char - колонка используется для хранения строки
- text - колонка используется для хранения строки не ограниченного размера
- blob - колонка используется для хранения строки не ограниченного размера
- datetime – колонка используется для хранения даты
Я не буду рассказывать, чем отличаются друг от друга похожие типы хранения данных, для этого есть документация по MySQL.
Помимо указания типов хранения данных, для каждой колонки можно указать и размер данной колонки, такие как:
- tiny – крошечный размер
- small – маленький размер
- medium – средний размер
- normal – нормальный размер
- big – большой размер
Список размеров для каждого из типов хранения данных можно посмотреть здесь.
После описания нашей таблицы, активируем модуль и смотрим, создалась ли наша таблица в базе данных:
Как видим, таблица у нас создалась именно с теми типами хранения данных, которые мы указали при описании таблицы.
Теперь нам нужно позаботиться о том, что бы наша таблица, так же автоматически удалялась при удалении модуля, для этого используется хук:
<?php
module_name_uninstall()
Файл module_name.install
<?php
/**
* @return mixed
* Implements hook_schema()
*/
function database_ex_schema() {
# Database example
$schema['database_ex'] = array( // Название таблицы
'description' => 'Database example', // Описание таблицы
'fields' => array( // Массив с колонками таблицы
'id' => array( // Название колонки
'description' => 'ID', // Описание колонки
'type' => 'serial', // Тип данных
'unsigned' => TRUE, // Unsigned, по умолчанию FALSE
'not null' => TRUE, // Проверка на 0
),
'uid' => array(
'description' => 'UID user',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0, // Значение по умолчанию
),
'text' => array(
'description' => 'Text',
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
),
'timestamp' => array(
'description' => 'Timestamp',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
),
),
'primary key' => array('id'),
);
return $schema;
}
/**
* Implements hook_uninstall().
*/
function database_ex_uninstall() {
# Remove table
\Drupal::state()->delete('database_ex.database_ex');
}
В качестве параметра передается название модуля и через точку, название таблицы для удаления
<?php
\Drupal::state()->delete('module_name.table_name');
Теперь можете отключить модуль и проверить существование таблицы. На этом можно пока закончить.
Скачать модуль используемый в примере.