Миграции — это удобный способ изменения вашей базы данных структурированным и организованным способом.

Часто в процессе разработки нам необходимо обновлять изменения в рабочей среде. Некоторые из этих изменений могут касаться изменений в базе данных: новые поля, новые таблицы, удаление индексов и т. д.

При миграции создается набор классов, чтобы описать, как ваша база данных структурирована в данный момент. Эти классы могут использоваться для синхронизации структуры схемы в удаленных базах данных и подготовки вашей базы данных к работе с новыми изменениями, которые реализует ваше приложение. Миграции описывают эти изменения с использованием простого 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_INTEGER
  • Phalcon\Db\Column::TYPE_VARCHAR
  • Phalcon\Db\Column::TYPE_CHAR
  • Phalcon\Db\Column::TYPE_DATE
  • Phalcon\Db\Column::TYPE_DATETIME
  • Phalcon\Db\Column::TYPE_TIMESTAMP
  • Phalcon\Db\Column::TYPE_DECIMAL
  • Phalcon\Db\Column::TYPE_TEXT
  • Phalcon\Db\Column::TYPE_BOOLEAN
  • Phalcon\Db\Column::TYPE_FLOAT
  • Phalcon\Db\Column::TYPE_DOUBLE
  • Phalcon\Db\Column::TYPE_TINYBLOB
  • Phalcon\Db\Column::TYPE_BLOB
  • Phalcon\Db\Column::TYPE_MEDIUMBLOB
  • Phalcon\Db\Column::TYPE_LONGBLOB
  • Phalcon\Db\Column::TYPE_JSON
  • Phalcon\Db\Column::TYPE_JSONB
  • Phalcon\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 будет выполнять необходимые миграции до достижения указанной версии.