Миграции (Migrations)
Определение
Миграции — что-то вроде системы контроля версий для вашей базы данных. Они позволяют вашей команде изменять структуру БД, в то же время оставаясь в курсе изменений других участников. Миграции обычно идут рука об руку с построителем структур для более простого обращения с архитектурой вашей базы данных. Если вы когда-нибудь просили коллегу вручную добавить столбец в его локальную БД, значит вы сталкивались с проблемой, которую решают миграции БД.
Фасад Schema обеспечивает поддержку создания и изменения таблиц в независимости от используемой СУБД из числа тех, что поддерживаются фреймфорком.
Принципы
- Миграции
СЛЕДУЕТ создавать внутри папок модулей - Миграции будут автоматически загружаться фреймворком.
Правила
- Нет необходимости публиковать миграции модулей в корневую Папку миграций. Просто запустите команду
, и Darklyy прочитает миграцию из модулей.darksander migrate
Структура папок
- usr
- modules
- {module-name}
- Data
- Migrations
- 2022_01_01_000001_create_new_table.php
- ...
Примеры кода
class CreateDemoTable extends Migration
{
public function up()
{
Schema::create('demo', function (Blueprint $table) {
$table->increments('id');
// ...
$table->timestamps();
$table->softDeletes();
});
}
public function down()
{
Schema::drop('demo');
}
}
Создание миграций
Для создания новой миграции используйте Darksander-команду
php darksander core:generate:migration
php darksander make:migration create_news_table
Миграция будет помещена в папку модуля в Data\Migrations и будет содержать метку времени, которая позволяет фреймворку определять порядок применения миграций. Можно также использовать параметры –table и –create для указания имени таблицы и того факта, что миграция будет создавать новую таблицу (а не изменять существующую — прим. пер.). Эти параметры просто заранее создают указанную таблицу в создаваемом файле-заглушке миграции:
php darksander core:generate:migration create_news_table --create=news
php darksander core:generate:migration add_views_to_news_table --table=news
Выполнение миграций
Для запуска всех необходимых вам миграций используйте Darksander-команду migrate.
php darksander migrate
Принудительные миграции в продакшне
Некоторые операции миграций разрушительны, значит они могут привести к потере ваших данных. Для предотвращения случайного запуска этих команд на вашей боевой БД перед их выполнением запрашивается подтверждение. Для принудительного запуска команд без подтверждения используйте ключ –force:
php darksander migrate --force
Откат миграций
Для отмены изменений, сделанных последней миграцией, используйте команду rollback. Эта команда отменит результат последней «партии» миграций, которая может включать несколько файлов миграций:
php darksander migrate:rollback
Вы можете сделать откат определённого числа миграций, указав параметр step для команды rollback. Например, эта команда откатит последние пять миграций:
php darksander migrate:rollback --step=5
Команда migrate:reset отменит изменения всех миграций вашего приложения:
php darksander migrate:reset
Откат всех миграций и их повторное применение одной командой
php darksander migrate:refresh
Вы можете откатить и повторно применить определённое число миграций, указав параметр step для команды refresh. Например, эта команда откатит и повторно применит последние пять миграций:
php darksander migrate:refresh --step=5
Таблицы
Создание таблиц
Для создания новой таблицы БД используйте метод create() фасада Schema. Метод create() принимает два аргумента. Первый — имя таблицы, второй — замыкание, которое получает объект Blueprint, который можно использовать для определения новой таблицы:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
});
Само собой, при создании таблицы вы можете использовать любые методы для работы со столбцами построителя структур.
Проверка существования таблицы/столбца
Вы можете легко проверить существование таблицы или столбца при помощи методов hasTable() и hasColumn():
if (Schema::hasTable('users')) {
//
}
if (Schema::hasColumn('users', 'email')) {
//
}
Подключение и подсистема хранения данных
Если вы хотите выполнить операции над структурой через подключение к БД, которое не является вашим основным подключением, используйте метод connection():
Schema::connection('foo')->create('users', function (Blueprint $table) {
$table->increments('id');
});
Используйте свойство engine построителя структур, чтобы задать подсистему хранения данных для таблицы:
Schema::create('users', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
});
Переименование/удаление таблиц
Для переименования существующей таблицы используйте метод rename():
Schema::rename($from, $to);
Для удаления существующей таблицы используйте методы drop() и dropIfExists():
Schema::drop('users');
Schema::dropIfExists('users');
Столбцы
Создание столбцов
Для изменения существующей таблицы мы будем использовать метод table() фасада Schema. Как и метод create(), метод table() принимает два аргумента: имя таблицы и замыкание, которое получает экземпляр Blueprint, который можно использовать для добавления столбцов в таблицу:
Schema::table('users', function (Blueprint $table) {
$table->string('email');
});
Доступные типы столбцов
Разумеется, построитель структур содержит различные типы столбцов, которые вы можете указывать при построении ваших таблиц:
Команда | Описание |
---|---|
$table->bigIncrements('id'); | Инкрементный ID (первичный ключ), использующий эквивалент «UNSIGNED BIG INTEGER» |
$table->bigInteger('votes'); | Эквивалент BIGINT для базы данных |
$table->binary('data'); | Эквивалент BLOB для базы данных |
$table->boolean('confirmed'); | Эквивалент BOOLEAN для базы данных |
$table->char('name', 4); | Эквивалент CHAR для базы данных |
$table->date('created_at'); | Эквивалент DATE для базы данных |
$table->dateTime('created_at'); | Эквивалент DATETIME для базы данных |
$table->dateTimeTz('created_at'); | Эквивалент DATETIME (с часовым поясом) для базы данных (для версии 5.2 и выше) |
$table->decimal('amount', 5, 2); | Эквивалент DECIMAL с точностью и масштабом |
$table->double('column', 15, 8); | Эквивалент DOUBLE с точностью, всего 15 цифр, после запятой 8 цифр |
$table->enum('choices', ['foo', 'bar']); | Эквивалент ENUM для базы данных |
$table->float('amount', 8, 2); | Эквивалент FLOAT для базы данных, всего 8 знаков, из них 2 после запятой (для версии 5.3 и выше) |
$table->float('amount'); | Эквивалент FLOAT для базы данных (для версии 5.2 и ранее) |
$table->foreignId('user_id'); | Метод foreignId является псевдонимом метода unsignedBigInteger |
$table->geometryCollection('positions'); | Метод geometryCollection создает эквивалент столбца GEOMETRYCOLLECTION |
$table->geometry('positions'); | Метод geometry создает эквивалент столбца GEOMETRY |
$table->id(); | Метод id является псевдонимом метода bigIncrements. По умолчанию метод создает столбец id; однако, вы можете передать имя столбца, если хотите присвоить столбцу другое имя |
$table->increments('id'); | Инкрементный ID (первичный ключ), использующий эквивалент «UNSIGNED INTEGER» |
$table->integer('votes'); | Эквивалент INTEGER для базы данных |
$table->ipAddress('visitor'); | Эквивалент IP-адреса для базы данных (для версии 5.2 и выше) |
$table->json('options'); | Эквивалент JSON для базы данных |
$table->jsonb('options'); | Эквивалент JSONB для базы данных |
$table->lineString('positions'); | Метод lineString создает эквивалент столбца LINESTRING |
$table->longText('description'); | Эквивалент LONGTEXT для базы данных |
$table->macAddress('device'); | Эквивалент MAC-адреса для базы данных (для версии 5.2 и выше) |
$table->mediumIncrements('id'); | Инкрементный ID (первичный ключ), использующий эквивалент «UNSIGNED MEDIUM INTEGER» (для версии 5.3 и выше) |
$table->mediumInteger('numbers'); | Эквивалент MEDIUMINT для базы данных |
$table->mediumText('description'); | Эквивалент MEDIUMTEXT для базы данных |
$table->morphs('taggable'); | Добавление столбца taggable_id INTEGER (для версии 5.3 и выше Unsigned INTEGER) и taggable_type STRING |
$table->multiLineString('positions'); | Метод multiLineString создает эквивалент столбца MULTILINESTRING |
$table->multiPoint('positions'); | Метод multiPoint создает эквивалент столбца MULTIPOINT: |
$table->multiPolygon('positions'); | Метод multiPolygon создает эквивалент столбца MULTIPOLYGON |
$table->nullableMorphs('taggable'); | Аналогично morphs(), но разрешено значение NULL (для версии 5.3 и выше) |
$table->nullableUuidMorphs('taggable'); | Метод аналогичен методу uuidMorphs; тем не менее, создаваемый столбец будет иметь значение NULL |
$table->nullableTimestamps(); | Аналогично timestamps(), но разрешено значение NULL |
$table->point('position'); | Метод point создает эквивалент столбца POINT |
$table->polygon('position'); | Метод polygon создает эквивалент столбца POLYGON |
$table->rememberToken(); | Добавление столбца remember_token VARCHAR(100) NULL |
$table->set('flavors', ['strawberry', 'vanilla']); | Метод set создает эквивалент столбца SET с заданным списком допустимых значений |
$table->smallIncrements('id'); | Инкрементный ID (первичный ключ), использующий эквивалент «UNSIGNED SMALL INTEGER» (для версии 5.3 и выше) |
$table->smallInteger('votes'); | Эквивалент SMALLINT для базы данных |
$table->softDeletesTz($column = 'deleted_at', $precision = 0); | Метод softDeletesTz добавляет NULL-эквивалент столбца TIMESTAMP (с часовым поясом) с необязательной точностью (общее количество цифр). |
$table->softDeletes(); | Добавление столбца deleted_at для мягкого удаления (для версии 5.3 и выше разрешено значение NULL) |
$table->string('email'); | Эквивалент VARCHAR |
$table->string('name', 100); | Эквивалент VARCHAR с длинной |
$table->text('description'); | Эквивалент TEXT для базы данных |
$table->time('sunrise'); | Эквивалент TIME для базы данных |
$table->timeTz('sunrise'); | Эквивалент TIME (с часовым поясом) для базы данных (для версии 5.2 и выше) |
$table->tinyInteger('numbers'); | Эквивалент TINYINT для базы данных |
$table->tinyIncrements('id'); | Метод tinyIncrements создает эквивалент автоинкрементного столбца UNSIGNED TINYINT в качестве первичного ключа: |
$table->tinyText('notes'); | Метод tinyText создаёт эквивалент столбца TINYTEXT: |
$table->timestamp('added_on'); | Эквивалент TIMESTAMP для базы данных |
$table->timestampTz('added_on'); | Эквивалент TIMESTAMP (с часовым поясом) для базы данных (для версии 5.2 и выше) |
$table->timestamps(); | Добавление столбцов created_at и updated_at (для версии 5.3 и выше разрешено значение NULL) |
$table->timestampsTz(); | Добавление столбцов created_at и updated_at (с часовым поясом), для которых разрешено значение NULL (для версии 5.3 и выше) |
$table->unsignedBigInteger('votes'); | Эквивалент Unsigned BIGINT для базы данных (для версии 5.3 и выше) |
$table->unsignedInteger('votes'); | Эквивалент Unsigned INT для базы данных (для версии 5.3 и выше) |
$table->unsignedMediumInteger('votes'); | Эквивалент Unsigned MEDIUMINT для базы данных (для версии 5.3 и выше) |
$table->unsignedSmallInteger('votes'); | Эквивалент Unsigned SMALLINT для базы данных (для версии 5.3 и выше) |
$table->unsignedTinyInteger('votes'); | Эквивалент Unsigned TINYINT для базы данных (для версии 5.3 и выше) |
$table->uuid('id'); | Эквивалент UUID для базы данных |
$table->uuidMorphs('taggable'); | Метод uuidMorphs – это удобный метод, который добавляет эквивалент столбца CHAR(36) ({column}_id) и эквивалент столбца VARCHAR ({column}_type). |
$table->year('birth_year'); | Метод year создает эквивалент столбца YEAR: |
$table->uid('uid', 'comment'); | Идентификатор пользователя ('uid', 'comment' являются не обязательными) |
$table->category('category'); | Идентификатор категории ('category' являются не обязательными) |
$table->org('org'); | Идентификатор организации ('org' являются не обязательными) |
$table->oid('oid', 'comment'); | Идентификатор контрагента ('oid', 'comment' являются не обязательными) |
$table->status('status', 'comment'); | Статус ('status', 'comment' являются не обязательными) |
$table->comment_column('comment_column', 'comment'); | Комментарий ('comment_column', 'comment' являются не обязательными) |
$table->numb(); | Создания счетчика нумерации (создается две колонки numb и numb_counter) |
Модификаторы столбцов
Вдобавок к перечисленным типам столбцов существует несколько «модификаторов» столбцов, которые вы можете использовать при добавлении столбцов в таблицу. Например, чтобы сделать столбец «обнуляемым», используйте метод nullable():
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});
Ниже перечислены все доступные модификаторы столбцов. В этом списке отсутствуют модификаторы индексов:
Модификатор | Описание |
---|---|
->after('column') | Помещает столбец «после» указанного столбца (только MySQL) |
->autoIncrement() | Устанавливает на указанном поле значение Auto Increment (первичный ключ) |
->charset('utf8mb4') | Укажите кодировку символов для столбца (MySQL). |
->collation('utf8_general_ci') | Укажите параметры сортировки для столбца (MySQL/PostgreSQL/SQL Server). |
->comment('my comment') | Добавляет комментарий в столбец |
->default($value) | Указывает значение «по умолчанию» для столбца |
->first() | Помещает столбец «первым» в таблице (только MySQL) |
->from($integer) | Установите начальное значение автоинкрементного поля (MySQL/PostgreSQL) |
->invisible() | Сделайте столбец «невидимым» для SELECT запросов (MySQL). |
->nullable() | Разрешает вставлять значения NULL в столбец |
->storedAs($expression) | Создать генерируемый столбец типа stored (только MySQL) |
->unsigned() | Делает столбцы integer беззнаковыми UNSIGNED |
->useCurrent() | Создайте сохраненный сгенерированный столбец (MySQL/PostgreSQL). |
->useCurrentOnUpdate() | Установите столбцы TIMESTAMP для использования CURRENT_TIMESTAMP при обновлении записи (MySQL). |
->virtualAs($expression) | Создать генерируемый столбец типа virtual (только MySQL) |
->generatedAs($expression) | Создайте столбец идентификаторов с указанными параметрами последовательности (PostgreSQL). |
->always() | Определяет приоритет значений последовательности над входными данными для столбца идентификаторов (PostgreSQL). |
->isGeometry() | Установите тип пространственного столбца geometry— тип по умолчанию — geography(PostgreSQL). |