12 Миграции базы данных
Миграции — это удобный способ изменения вашей базы данных структурированным и организованным способом.
Часто в процессе разработки нам необходимо обновлять изменения в рабочей среде. Некоторые из этих изменений могут касаться изменений в базе данных: новые поля, новые таблицы, удаление индексов и т. д.
При миграции создается набор классов, чтобы описать, как ваша база данных структурирована в данный момент. Эти классы могут использоваться для синхронизации структуры схемы в удаленных базах данных и подготовки вашей базы данных к работе с новыми изменениями, которые реализует ваше приложение. Миграции описывают эти изменения с использованием простого PHP.
Сохранение схемы БД
Phalcon Developer Tools предоставляет скрипты для управления миграциями (генерация, запуск и откат).
Доступные опции для генерации миграций:

Запуск скрипта без каких-либо параметров делает простой дамп каждого объекта (таблиц и представлений) из вашей базы данных в классы миграции.
Каждая миграция имеет версию — идентификатор, который с ней ассоциируется. Номер версии позволяет нам определить, является ли миграция старше или новее текущей версии нашей базы данных. Версии также сообщают Phalcon о рабочем состоянии при выполнении миграции.

При генерации миграции, в консоли отображаются инструкции, описывающие шаги миграции, и время их выполнения. В конце концов, версия миграция будет создана.
По умолчанию Phalcon Developer Tools использует директорию app/migrations для сохранения файлов миграции. Вы можете изменить расположение, установив один из параметров по генерации скрипта. Каждая таблица в базе данных имеет свой соответствующий класс, созданный в отдельном файле директории, ссылающейся на её версию:

Структура класса Migration
Каждый файл содержит уникальный класс, расширяющий класс Phalcon\Mvc\Model\Migration. Эти классы обычно имеют два метода: up() и down(). up() выполняет миграцию, а down() выполняет ее откат.
up() также содержит магический метод morphTable(). Магия возникает, когда она распознает изменения, необходимые для синхронизации фактической таблицы в базе данных с описанием.
<?php
use Phalcon\Db\Column as Column;
use Phalcon\Db\Index as Index;
use Phalcon\Db\Reference as Reference;
use Phalcon\Mvc\Model\Migration;
class ProductsMigration_100 extends Migration
{
public function up()
{
$this->morphTable(
'products',
[
'columns' => [
new Column(
'id',
[
'type' => Column::TYPE_INTEGER,
'size' => 10,
'unsigned' => true,
'notNull' => true,
'autoIncrement' => true,
'first' => true,
]
),
new Column(
'product_types_id',
[
'type' => Column::TYPE_INTEGER,
'size' => 10,
'unsigned' => true,
'notNull' => true,
'after' => 'id',
]
),
new Column(
'name',
[
'type' => Column::TYPE_VARCHAR,
'size' => 70,
'notNull' => true,
'after' => 'product_types_id',
]
),
new Column(
'price',
[
'type' => Column::TYPE_DECIMAL,
'size' => 16,
'scale' => 2,
'notNull' => true,
'after' => 'name',
]
),
],
'indexes' => [
new Index(
'PRIMARY',
[
'id',
]
),
new Index(
'product_types_id',
[
'product_types_id',
]
),
],
'references' => [
new Reference(
'products_ibfk_1',
[
'referencedSchema' => 'invo',
'referencedTable' => 'product_types',
'columns' => ['product_types_id'],
'referencedColumns' => ['id'],
]
),
],
'options' => [
'TABLE_TYPE' => 'BASE TABLE',
'ENGINE' => 'InnoDB',
'TABLE_COLLATION' => 'utf8_general_ci',
],
]
);
}
}
Класс называется ProductsMigration_100. Суффикс 100 относится к версии 1.0.0. morphTable() получает ассоциативный массив из 4 возможных секций:
| Параметр | Описание | Опционально |
|---|---|---|
columns |
Массив c набором столбцов таблицы. | Нет |
indexes |
Массив с набором индексов таблицы. | Да |
references |
Массив с набором связей таблицы (внешние ключи). | Да |
options |
Массив с набором параметров создания таблицы. Эти параметры часто связаны с системой баз данных, в которой была создана миграция. | Да |
Определение столбцов
Phalcon\Db\Column используется для определения столбцов таблицы. Он инкапсулирует широкий спектр функций, связанных со столбцами. Его конструктор получает в качестве первого параметра имя столбца и массив, описывающий столбец. При описании столбцов доступны следующие параметры:
| Свойство | Описание | Опционально |
|---|---|---|
type |
Тип столбца. Должна быть константой Phalcon\Db\Column (см. ниже) | Нет |
size |
Размер, который указывается для некоторые типов столбцов, таких как VARCHAR или INTEGER |
Да |
scale |
Количество десятичных знаков после запятой для столбцов DECIMAL или NUMBER |
Да |
unsigned |
INTEGER columns may be signed or unsigned. This option does not apply to other types of columns |
Да |
notNull |
Может ли столбец содержать значения Null? | Да |
default |
Значение по умолчанию для столбца (Должно быть конкретизировано. Использование функций, таких как NOW(), не допускается) |
Да |
autoIncrement |
С помощью этого атрибута столбец будет заполнен автоматически с автоинкрементным целым числом. Только один столбец в таблице может иметь этот атрибут. | Да |
primary |
Sets this column as a primary key index using columnName_pkey as identifier. Type - BOOLEAN |
Да |
first |
Столбец будет размещен первым в структуре таблицы | Да |
after |
Название столбца, после которого будет размещен текущий столбец | Да |
Миграции поддерживают следующие типы столбцов:
Phalcon\Db\Column::TYPE_INTEGERPhalcon\Db\Column::TYPE_VARCHARPhalcon\Db\Column::TYPE_CHARPhalcon\Db\Column::TYPE_DATEPhalcon\Db\Column::TYPE_DATETIMEPhalcon\Db\Column::TYPE_TIMESTAMPPhalcon\Db\Column::TYPE_DECIMALPhalcon\Db\Column::TYPE_TEXTPhalcon\Db\Column::TYPE_BOOLEANPhalcon\Db\Column::TYPE_FLOATPhalcon\Db\Column::TYPE_DOUBLEPhalcon\Db\Column::TYPE_TINYBLOBPhalcon\Db\Column::TYPE_BLOBPhalcon\Db\Column::TYPE_MEDIUMBLOBPhalcon\Db\Column::TYPE_LONGBLOBPhalcon\Db\Column::TYPE_JSONPhalcon\Db\Column::TYPE_JSONBPhalcon\Db\Column::TYPE_BIGINTEGER
Определение Индексов
Phalcon\Db\Index определяет индексы таблицы. Для индекса требуется только определить его имя и список столбцов. Заметим, что если любой индекс имеет название PRIMARY, то Phalcon создаст индекс первичного ключа в этой таблице.
Определение Связей
Phalcon\Db\Reference определяет ссылки на таблицы (также называемые внешними ключами). Для определения ссылки можно использовать следующие параметры:
| Параметр | Описание | Опционально | Реализовано в |
|---|---|---|---|
referencedTable |
Говорит само за себя. Она ссылается на имя таблицы. | Нет | Все адаптеры |
columns |
Массив с названием столбцов, которые формируют связь с внешней таблицей. | Нет | Все адаптеры |
referencedColumns |
Массив с названием столбцов связываемой (внешней) таблицы. | Нет | Все адаптеры |
referencedSchema |
The referenced table maybe is on another schema or database. This option allows you to define that. | Да | Все адаптеры |
onDelete |
Если внешняя запись удалена, выполняет это действие с локальной записью (записями). | Да | MySQL PostgreSQL |
onUpdate |
Если внешняя запись обновлена, выполняет это действие с локальной записью (записями). | Да | MySQL PostgreSQL |
Запись миграций
Миграции предназначены не только для преобразования таблиц. Миграция-это обычный PHP класс, поэтому вы не ограничены этими функциями. Например, после добавления столбца можно написать код для задания значения этого столбца для существующих записей. Для более подробной информации и примеров отдельных методов, обратитесь к разделу Уровень абстракции базы данных.
<?php
use Phalcon\Mvc\Model\Migration;
class ProductsMigration_100 extends Migration
{
public function up()
{
// ...
self::$_connection->insert(
'products',
[
'Malabar spinach',
14.50,
],
[
'name',
'price',
]
);
}
}
Запуск миграций
После загрузки созданных миграций на целевой сервер их можно легко запустить, как показано в следующем примере:


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