1

是否可以添加一个新列,将一些数据复制到这个新列并使用 Laravel 迁移更新另一列中的数据?

我有一张这样的桌子;

ID 物品 价格
1 项目一 100.00
2 项目二 200.00

现在我需要做的是,

  1. old_price向此表添加一个新列
  2. 将列中的值复制price到新添加的old_price
  3. 将列中的值乘以price5 并更新同一列

新表应如下所示;

ID 物品 价格 旧价格
1 项目一 500.00 100.00
2 项目二 1000.00 200.00

是否有可能通过迁移或种子或其他方式来实现这一目标?

此更改需要在已经投入生产的应用程序上完成,因此删除和重新创建表对我来说不是一个选项。

此外,old_price创建列只是为了保持对price列当前值的引用。在此之后将不会更新,如果新价格一切正常,它可能会在以后的更新中被删除。所以我之后不需要使用任何模型事件来更新列。

非常感谢您对此提供的任何帮助。谢谢。

4

1 回答 1

2

创建一个新的迁移。

版本 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
于 2021-08-18T16:49:41.780 回答