Laravel批量更新多个记录ID

时间:2018-07-25 10:59:48

标签: php mysql laravel eloquent

我想在Laravel中大规模更新我的记录,但是记录没有更新。每个ID都有不同的记录。以下是我正在尝试的方法。

$ids = [5,6,8,9],
$updated_array = [
  ['name' => 'tarun'],
  ['name' => 'Akash'],
  ['name' => 'Soniya'],
  ['name' => 'Shalu'],
];

Model::whereIn('id', $ids)->update($updated_array);

6 个答案:

答案 0 :(得分:3)

在尝试将多行更新为相同值时使用批量更新。您无法使用不同的值进行批量更新。

因此,这可行,但是会将所有匹配的记录更新为“ tarun”的名称:

Model::whereIn('id', $ids)->update(['name' => 'tarun']);

例如,您可以这样做:

foreach($ids as $key => $id) {
    Model::where('id', $id)->update($updated_array[$key]);
}

但是据我所知,如果没有在Laravel中运行4个查询并编写原始SQL语句来完成此操作,那将是很混乱的。

答案 1 :(得分:2)

下面的帖子中对此问题提供了一些好的解决方案:https://github.com/laravel/ideas/issues/575

1)可以根据帖子中的barryvdh注释创建使用原始SQL的自定义函数来执行此操作。

    public static function updateValues(array $values)
    {
        $table = MyModel::getModel()->getTable();

        $cases = [];
        $ids = [];
        $params = [];

        foreach ($values as $id => $value) {
            $id = (int) $id;
            $cases[] = "WHEN {$id} then ?";
            $params[] = $value;
            $ids[] = $id;
        }

        $ids = implode(',', $ids);
        $cases = implode(' ', $cases);
        $params[] = Carbon::now();

        return \DB::update("UPDATE `{$table}` SET `value` = CASE `id` {$cases} END, `updated_at` = ? WHERE `id` in ({$ids})", $params);
    }

这显然使性能提高了13倍

2)根据另一条评论,另一个想法是在每个记录的基础上执行此操作,但是将整个操作作为一个事务进行,这使它更快。

    DB::beginTransaction();

    // your loop and updates;

    if( !$user )
    {
    rollbackTransaction();
    } else {
    // Else commit the queries
    commitTransaction();
    }


3)也有一个laravel库,它似乎试图解决此问题。 https://github.com/mavinoo/laravelBatch

注意:我没有尝试或测试以上任何解决方案。

答案 2 :(得分:1)

我认为没有n次查询的唯一方法是

  • (可选)备份表
  • 抓取记录并使用所有更新的数据创建一个数组
  • 批量删除记录
  • 从数组批量插入

这是3个查询。

遍历n条记录对我的应用程序也不可行;我希望有替代方法,但看来我将不得不实现它。

答案 3 :(得分:0)

请尝试以下代码:

$data_to_be_updated = [ ['id'=>5,'name' => 'tarun'], ['id'=>6, 'name' => 'Akash'],
                        ['id'=>8, 'name' => 'Soniya'], ['id'=>9,'name' => 'Shalu']
                      ];
foreach ($data_to_be_updated as $key => $value) {
    $data = Model::where('id',$value['id'])->first();
    if ($data) {
        $data->name = $value['name'];
        $data->save();
    }
}

答案 4 :(得分:0)

您可以按照上述步骤进行操作:-

foreach($ids as $key => $id) {
    Model::where('id', $id)->update($updated_array[$key]);
}

答案 5 :(得分:0)

请尝试下面给出的以下代码进行批量更新

 <ModelName>::where('id', $id)->update($request->all());