VESP: Обновление существующих таблиц в базе
В этой статье я делюсь своим опытом о том, как лучше всего обновить существующие таблицы БД при работе с VESP.
В заметке Знакомимся с Vesp Core описан базовый функционал создания таблиц через миграции. Пока сайт находится в разработке и в таблицах нет ценных данных, можно менять таблицы полностью откатывая все миграции, и запуская их заново. Это отлично работает. Но удаляет все данные из таблиц и для работающего сайта не годится.
Задача: добавить в уже существующую таблицу Products новую колонку brand и brand_id, при этом не удаляя всю таблицу.
Для обновления таблиц на работающем сайте нужно создать новую миграцию. Это удобно тем, что ее затем можно откатить отдельно.
Итак, миграция создалась и теперь приводим ее к нужному виду. При этом мы будем использовать $this->schema->table(), который позволяет добавлять колонки вместо $this->schema->create().
Запускаем нашу новую миграцию
Спасибо за внимание. Надеюсь, это поможет тем, кто только погружается в освоение VESP.
В заметке Знакомимся с Vesp Core описан базовый функционал создания таблиц через миграции. Пока сайт находится в разработке и в таблицах нет ценных данных, можно менять таблицы полностью откатывая все миграции, и запуская их заново. Это отлично работает. Но удаляет все данные из таблиц и для работающего сайта не годится.
Задача: добавить в уже существующую таблицу Products новую колонку brand и brand_id, при этом не удаляя всю таблицу.
Для обновления таблиц на работающем сайте нужно создать новую миграцию. Это удобно тем, что ее затем можно откатить отдельно.
./vendor/bin/phinx create ProductsBrand
Обратите внимание, что миграция должна иметь уникальное название, иначе получим ошибку такого вида: The migration class name «Products» already exists. Итак, миграция создалась и теперь приводим ее к нужному виду. При этом мы будем использовать $this->schema->table(), который позволяет добавлять колонки вместо $this->schema->create().
<?php
use Illuminate\Database\Schema\Blueprint;
use Vesp\Services\Migration;
class ProductsBrand extends Migration
{
public function up()
{
$this->schema->table(
'products', // Таблица товаров
function (Blueprint $table) {
//Тут описываем любые изменеия, которые нужно внести в указанную таблицу при запуске миграции.
$table->string('brand', 255)->after('id'); //Добавляем колонку Бренд после колонки id
$table->integer('brand_id')->after('updated_at')->unsigned();
$table->foreign('brand_id')->references('id')->on('brands');
$table->index(['brand_id']);
}
);
}
public function down()
{
$this->schema->table(
'products', // Таблица товаров
function (Blueprint $table) {
//Тут описываем любые изменеия, которые нужно внести в указанную таблицу при откате миграции.
$table->dropColumn(['brand', 'brand_id']); // Удаляем столбцы
}
);
}
}
Внимание: если есть вопросы по синтаксису, то читайте документациию по Eloquent. Там все описано.Запускаем нашу новую миграцию
./vendor/bin/phinx migrate
И наслаждаемся изменениями в нашей таблице. Колонки добавились, остальные данные на месте. Что и требовалось. При этом данные изменения можно легко откатить. Мы ведь описали все в функции down().Спасибо за внимание. Надеюсь, это поможет тем, кто только погружается в освоение VESP.