• урок
  • pantey

Drupal 8 – Database API. Часть 1 - Создание таблицы

14.08.2017

Сегодня будем разбираться с основами 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 колонки:

  1. id – используется для нумерации строк в таблице
  2. uid – будет использоваться для хранения UID пользователя
  3. text – будет использоваться для хранения текста
  4. timestamp – будет использоваться для хранения времени записи

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

Существуют следующие типы данных:

  1. serial – колонка должна содержать только целое число, используется как правило, только для автоинкремента
  2. int – колонка должна содержать только целое число
  3. float – колонка должна содержать число с плавающей точкой
  4. numeric – колонка должна содержать числовое значение
  5. varchar – колонка используется для хранения строки
  6. char - колонка используется для хранения строки
  7. text - колонка используется для хранения строки не ограниченного размера
  8. blob - колонка используется для хранения строки не ограниченного размера
  9. datetime – колонка используется для хранения даты

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

Помимо указания типов хранения данных, для каждой колонки можно указать и размер данной колонки, такие как:

  • tiny – крошечный размер
  • small – маленький размер
  • medium – средний размер
  • normal – нормальный размер
  • big – большой размер

Список размеров для каждого из типов хранения данных можно посмотреть здесь.

После описания нашей таблицы, активируем модуль и смотрим, создалась ли наша таблица в базе данных:

databse_api_1_drupal_8.png

Как видим, таблица у нас создалась именно с теми типами хранения данных, которые мы указали при описании таблицы.

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

<?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');

Теперь можете отключить модуль и проверить существование таблицы. На этом можно пока закончить.

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

Скачать

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