在 Laravel 5 迁移中更新表并添加数据

Posted

技术标签:

【中文标题】在 Laravel 5 迁移中更新表并添加数据【英文标题】:Update table and add data in a Laravel 5 Migration 【发布时间】:2016-09-25 12:01:30 【问题描述】:

我需要在我的 laravel 项目中添加一个新列,这个没问题,我用Schema::table() 更新,没关系。 现在我需要找出这张表上有多少条记录并更新一些值。

我有桌子Warrants

Schema::create('warrant_grants', function(Blueprint $table) 
    $table->increments('id');
    $table->integer('warrant_plan_id');
    $table->integer('shareholder_id');
);

所以我用新的迁移文件创建了新字段:

Schema::table('warrant_grants',function ($table) 
    $table->string('name',100);
);

现在我需要用一些值更新表中的这个字段name,例如,如果表有 100 条记录,那么我需要在每一行中插入值“Warrant-X”,其中 X 是一个数字开头1到100。 例如:

Warrant-1, Warrant-2, ....Warrant-100。

我花了几个小时寻找使用 Seeds 的方法,但没有找到。所以基本上我有两个问题:

我可以在 Laravel 5 中使用 Seeds 来更新值还是直接插入它们? 我可以在种子(或迁移)中创建一些 SQL 来为我执行此更新吗?

【问题讨论】:

您可以在迁移中更新值。 【参考方案1】:

根据这个链接我找到了答案:https://***.com/a/23506744/4650792

Schema::table('warrant_grants',function ($table)
        $table->string('name',100)->after('id')->nullable();
    );

    $results = DB::table('warrant_grants')->select('id','name')->get();

    $i = 1;
    foreach ($results as $result)
        DB::table('warrant_grants')
            ->where('id',$result->id)
            ->update([
                "name" => "Warrant-".$i
        ]);
        $i++;
    

谢谢大家的帮助。

【讨论】:

【参考方案2】:

其他答案是正确的。但请注意,如果您有很多记录,则使用 ORM 更新所有记录可能需要一些时间。使用原始 SQL 查询可以更快地做到这一点。

Schema::table('warrant_grants',function ($table)
        $table->string('name',100)->after('id')->nullable();
    );
DB::raw("UPDATE warrant_grants SET name=name+id");

SQL 查询不准确,您必须为自己的数据库创建它,但您明白了。

【讨论】:

其实,要执行一条sql命令,正确的方法应该是DB::statement而不是DB::raw【参考方案3】:

是的,您可以在迁移中执行更新/插入/任何操作。例如:

Schema::table('warrant_grants', function($table) 
    $table->string('name', 100);
);

$i = 1;
foreach (WarrantGrants::all() as $warrant_grant) 
    $warrant_grant->update([
      'name' => 'Warrant-' . $i
    ]);

    $i++;

【讨论】:

一般来说,在您的迁移中使用模型并不是一个好主意,因为该模型将来可能会发生变化。这可能会破坏您的迁移。查看 Deric Lima 关于如何在不使用 Laravel 模型的情况下使用低级查询的答案。【参考方案4】:

实现此目的的另一种可能的语法:

DB::table('warrant_grants')
   ->where('id',$result->id)
   ->update([
      "name" => DB::raw("'Warrant-' + `name`")
   ]);

这允许更新作为一个批次完成,而不是迭代结果,并保留大部分熟悉的 Eloquent 语法,而不是回退到仅使用原始 SQL。

可能需要根据使用的 SQL 变体更改字符串连接语法。

【讨论】:

以上是关于在 Laravel 5 迁移中更新表并添加数据的主要内容,如果未能解决你的问题,请参考以下文章

更新表方案而不影响 Laravel 中的数据

在 Laravel 5.1 中添加带有迁移的列后,无法在我的数据库中修改“updated_at”

Laravel 5.2 迁移:无法添加 char 数据类型的外键

laravel 5 迁移向我的数据库表添加了一些主键。怎样防止形成呢?

Laravel:检查是不是有新项目添加到 db 表并安排一个工作给用户发送电子邮件

将 created_at 列添加到迁移表 - Laravel