【问题标题】:Update table and add data in a Laravel 5 Migration在 Laravel 5 迁移中更新表并添加数据
【发布时间】: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 来为我执行此更新吗?

【问题讨论】:

  • 您可以在迁移中更新值。

标签: php postgresql laravel


【解决方案1】:

根据这个链接我找到了答案: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++;
    }

谢谢大家的帮助。

【讨论】:

    【解决方案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 变体更改字符串连接语法。

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2016-07-23
      • 2015-09-22
      • 2018-07-18
      • 2017-12-02
      • 2020-02-17
      • 2013-05-23
      • 2016-08-11
      相关资源
      最近更新 更多