使用 Laravel 5.5 如何通过迁移复制表中的列?

Zac*_*erg 3 php laravel laravel-5

我想seasons使用 Laravel 5.5 中的迁移在现有表上复制一列。

我可以使用 SQL 运行这两个查询来完成此操作:

ALTER TABLE seasons ADD uploader_channel_partner_id BIGINT NULL 
Run Code Online (Sandbox Code Playgroud)

然后

UPDATE seasons set seasons.uploader_channel_partner_id = seasons.channel_partner_id
Run Code Online (Sandbox Code Playgroud)

我正在创建一个系统,您可以在其中转移视频的所有权,同时保留原始上传者的存储。

我的迁移的 up 函数目前只包含以下内容:

Schema::create('seasons', function (Blueprint $table) {
    $table->unsignedBigInteger('uploader_channel_partner_id');
    $table->foreign('uploader_channel_partner_id')->references('id')->on('channel_partners');
});
Run Code Online (Sandbox Code Playgroud)

编辑:

我已经让它工作了,但它又慢又难看,我确信有更好的方法:

public function up()
{
    Schema::table('seasons', function (Blueprint $table) {
        $table->unsignedBigInteger('uploader_channel_partner_id')->after('channel_partner_id')->nullable();
        $table->foreign('uploader_channel_partner_id')->references('id')->on('channel_partners');
    });
    $seasons = Season::withTrashed()->get();
    foreach ($seasons as $key => $season) {
        $season->uploader_channel_partner_id = $season->channel_partner_id;
        $season->save();
    }
}
Run Code Online (Sandbox Code Playgroud)

mrh*_*rhn 5

您可以使用DB::raw()to 强制Sql使用另一列而不是字符串值。

Season::withTrashed()
    ->update([
        'uploader_channel_partner_id' => DB::raw('`channel_partner_id`'),
    ]);
Run Code Online (Sandbox Code Playgroud)