VESP: Обновление существующих таблиц в базе

В этой статье я делюсь своим опытом о том, как лучше всего обновить существующие таблицы БД при работе с 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.
Иван Бондаренко
22 октября 2020, 12:29
modx.pro
2
289
+15

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0