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

Der*_*ima 14 php postgresql laravel

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

我有桌子Warrants:

Schema::create('warrant_grants', function(Blueprint $table) {
    $table->increments('id');
    $table->integer('warrant_plan_id');
    $table->integer('shareholder_id');
});
Run Code Online (Sandbox Code Playgroud)

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

Schema::table('warrant_grants',function ($table) {
    $table->string('name',100);
});
Run Code Online (Sandbox Code Playgroud)

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

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

我花了几个小时寻找一些方法来使用种子,但我没有找到.所以基本上我有两个问题:

  • 我可以在Laravel 5中使用Seeds来更新值,或者我可以插入它们吗?
  • 我可以在Seeds(或迁移)中创建一些SQL来为我做这个更新吗?

vfs*_*aki 11

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

Schema::table('warrant_grants',function ($table){
        $table->string('name',100)->after('id')->nullable();
    });
DB::raw("UPDATE warrant_grants SET name=name+id");
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,要执行 sql 命令,正确的方法是使用 ```DB::statement``` 而不是 ```DB::raw``` (4认同)

Der*_*ima 10

根据此链接,我找到了答案:https://stackoverflow.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++;
    }
Run Code Online (Sandbox Code Playgroud)

无论如何,谢谢你的帮助.


rh1*_*h16 8

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

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

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

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


Oli*_*vic 7

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

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++;
}
Run Code Online (Sandbox Code Playgroud)

  • 通常,在迁移中使用模型不是一个好主意,因为该模型将来可能会发生变化.这可能会破坏您的迁移.检查Deric Lima关于如何在不使用Laravel模型的情况下使用低级查询的答案. (2认同)