Обновление данных существующего столбца и копирование данных с миграциями

Можно ли добавить новый столбец, скопировать некоторые данные в этот новый столбец и обновить данные в другом столбце с помощью миграции Laravel?

У меня есть таблица примерно такая;

Можно ли добиться этого с помощью миграции или семени или чего-то еще?

Это изменение необходимо сделать в приложении, которое уже находится в производстве, поэтому удаление и повторное создание таблиц для меня не вариант.

Так же столбец создается только для того, чтобы хранить ссылку на текущие значения столбец. После этого он не будет обновляться и, вероятно, будет удален в более позднем обновлении, если с новыми ценами все пойдет правильно. Поэтому мне не нужно использовать какие-либо события модели для последующего обновления столбца.

Любая помощь, которую вы можете мне дать, очень ценится. Спасибо.

1 ответ

Решение

Создайте новую миграцию.

Версия 1. создать автоматически командой:

      php artisan make:migration add_price_old_to_products_table

Версия 2. Создайте вручную примерно так:

2021_08_18_163618_add_price_old_to_products_table.php

Управляйте контентом, выполнив 3 шага в коде:

      <?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

class AddPriceOldToProductsTable extends Migration
{
    public function up()
    {
        // 1. creating a new column
        Schema::table('products', function (Blueprint $table) {
            // this is just an example, you can change this
            // NOTE: make sure that the type is the same as "price" column
            // for avoiding type conflicts
            $table->decimal('price_old', 10, 2)->nullable();
        });

        // 2. copying the existing column values into new one
        DB::statement("UPDATE products SET price_old = price");

        // 3. update the old/existing column
        // CHANGE YOUR "price" COLUMN HERE...
    }

    public function down()
    {
        Schema::table('products', function (Blueprint $table) {
            $table->dropColumn('price_old');
        });
    }
}

Запустите эту миграцию для создания нового столбца:

      php artisan migrate
Другие вопросы по тегам