Для додавання нової таблиці до бази даних Magento 2 необхідно створити файл у папці модуля:

app/code/<VendorName>/<ModuleName>/Setup/InstallSchema.php

помістіть у нього код:

<?php
namespace VendorName\ModuleName\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Adapter\AdapterInterface;
class InstallSchema implements InstallSchemaInterface
{
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;
        $installer->startSetup();
        //new table script will be there
        $installer->endSetup();
    }
}

InstallSchema.php - це файл, що відповідає за модифікацію структури бази даних під час встановлення модуля. При виконанні CLI команди php bin/magento setup:upgrade Magento 2 перевіряє чи з'явився новий модуль в системі, присутність у нього файла InstallSchema.php. При наявності викликає його метод install($setup, context). Зверніть увагу, що InstallSchema.php не буде задіюватись, якщо модуль встановлювався раніше.

Дані про версії встановлених модулів зберігаються у таблиці `setup_module`, що розміщена у базі даних (БД) Magento 2. Якщо, під час тестового встановлення модуля у БД створилась неочікувана структура - видаліть її разом із записом про інформацію вашого модуля із таблиці 'setup_module'. Виправіть код, знову виконайте php bin/magento setup:upgrade команду.

У прикладі ми створюватимемо таблицю для поширених запитань (FAQ - Frequently Asked Question(s)) і таблицю для зберігання залежностей FAQ - Store View, іншими словами на яких мовах буде доступна FAQ стаття.

Коментар "//new table script will be there" у файлі InstallSchema.php замініть кодом:

/**
* Create table 'magefan_faq'
*/
$table = $installer->getConnection()->newTable(
    $installer->getTable('magefan_faq')
)->addColumn(
    'faq_id',
    \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
    null,
    ['identity' => true, 'nullable' => false, 'primary' => true],
    'FAQ ID'
)->addColumn(
    'title',
    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
    255,
    ['nullable' => true],
    'FAQ Title'
)->addColumn(
    'meta_keywords',
    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
    '64k',
    ['nullable' => true],
    'FAQ Meta Keywords'
)->addColumn(
    'meta_description',
    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
    '64k',
    ['nullable' => true],
    'FAQ Meta Description'
)->addColumn(
    'identifier',
    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
    100,
    ['nullable' => true, 'default' => null],
    'FAQ String Identifier'
)->addColumn(
    'content_heading',
    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
    255,
    ['nullable' => true],
    'FAQ Content Heading'
)->addColumn(
    'content',
    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
    '2M',
    [],
    'FAQ Content'
)->addColumn(
    'creation_time',
    \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
    null,
    [],
    'FAQ Creation Time'
)->addColumn(
    'update_time',
    \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
    null,
    [],
    'FAQ Modification Time'
)->addColumn(
    'is_active',
    \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
    null,
    ['nullable' => false, 'default' => '1'],
    'Is FAQ Active'
    )->addIndex(
    $installer->getIdxName('magefan_faq', ['identifier']),
    ['identifier']
)->setComment(
    'Magefan FAQ Table'
);
$installer->getConnection()->createTable($table);
/**
* Create table 'magefan_faq_store'
*/
$table = $installer->getConnection()->newTable(
    $installer->getTable('magefan_faq_store')
)->addColumn(
    'faq_id',
    \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
    null,
    ['nullable' => false, 'primary' => true],
    'FAQ ID'
)->addColumn(
    'store_id',
    \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
    null,
    ['unsigned' => true, 'nullable' => false, 'primary' => true],
    'Store ID'
)->addIndex(
    $installer->getIdxName('magefan_faq_store', ['store_id']),
    ['store_id']
)->addForeignKey(
    $installer->getFkName('magefan_faq_store', 'faq_id', 'magefan_faq', 'faq_id'),
    'faq_id',
    $installer->getTable('magefan_faq'),
    'faq_id',
    \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
)->addForeignKey(
    $installer->getFkName('magefan_faq_store', 'store_id', 'store', 'store_id'),
    'store_id',
    $installer->getTable('store'),
    'store_id',
    \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
)->setComment(
    'Magefan FAQ To Store Linkage Table'
);
$installer->getConnection()->createTable($table);

Нижче подано специфікацію методів.

Метод addColumn:

/**
* Додає колонку до таблиці.
*
* $options містить додаткові опції для колонки. Дозволені параметри:
* - 'unsigned', використовується лише для чисельних типів. За замовчуванням приймає значення FALSE;
* - 'precision', використовується лише для чисельних типів. За замовчуванням отримує значення із параметра $size, інакше рівне 0;
* - 'scale',  використовується лише для чисельних типів. За замовчуванням отримує значення із параметра $size, інакше рівне 10;
* - 'default', значення за замовчуванням відсутнє;
* - 'nullable', значення за замовчуванням: TRUE;
* - 'primary', додає колонку до primary індексу.  За замовчуванням колонка не додається до primary індексу;
* - 'primary_position', використовується колонка із primary індексу. Значення за замовчуванням: кількість primary колонок + 1;
* - 'identity' or 'auto_increment'. значення за замовчуванням відсутнє;
*
* @param стрічка $name - назва колонки;
* @param стрічка $type - тип даних колонки;
* @param стрічка|ціле число|масив $size - довжина (розмір) колонки;
* @param масив $options масив з додатковими опціями;
* @param стрічка $comment - коментар до колонки;
* @return $this
*/
public function addColumn($name, $type, $size = null, $options = [], $comment = null)

Метод setComment:

/**
* Задає коментар до таблиці.
*
* @param стрічка $comment - текс коментаря;
* @return $this
*/
public function setComment($comment)

Метод addIndex:

/**
* Додає індекс до таблиці.
*
* @param стрічка $indexName - назва індексу;
* @param масив чи стрічка $fields - масив назв колонок або назва колонки;
* @param масив $options - масив додаткових опцій;
* @return $this
*/
public function addIndex($indexName, $fields, $options = [])

Метод addForeignKey:

/**
* Додає зовнішній ключ до таблиці.
*
* @param стрічка $fkName - назва зовнішнього ключа;
* @param стрічка $column  - назва ключа колонки для зовнішнього ключа;
* @param стрічка $refTable - назва зовнішньої таблиці;
* @param стрічка $refColumn - назва зовнішньох колонки;
* @param стрічка $onDelete - подія на видалення рядка;
* @return $this
*/
public function addForeignKey($fkName, $column, $refTable, $refColumn, $onDelete = null)

Усі ці методи оголошені у файлі vendor/magento/framework/DB/Ddl/Table.php

Збережіть файл InstallSchema.php. Якщо ваш модуль наявний у таблиці 'setup_module', то видаліть його.

Запустустіть процес встановлення модуля, виконайте CLI команду:

php bin/magento setup:upgrade

Перевірте структуру бази даних, наприклад за допомогою phpMyAdmin. Ви побачите нові таблиці.

Структура бази даних в phpMyAdmin

База даних Magento 2 містить близько 200 таблиць, якщо ви не можете знайти свою, перейдіть на наступну сторінку у списку.

На GitHub можна переглянути змінені файли модуля Magefan_Faq.