laravel批量更新多个记录id

rta7y2nd  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(611)

我想大规模更新我的记录,但记录没有得到更新。我有一个不同的记录,每个id。下面是我正在尝试的。

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

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

rks48beu1#

以下是解决这个问题的一些好办法: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) 有一个拉拉维尔图书馆似乎也试图解决这个问题。https://github.com/mavinoo/laravelbatch
注:我没有尝试或测试上述任何解决方案。

3wabscal

3wabscal2#

你可以这样做上面mentioned:-

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

w9apscun3#

我认为没有n个查询的唯一方法是
(可选)备份表
抓取记录并创建一个包含所有更新数据的数组
批量删除记录
从数组批量插入
这是3个查询。
对我的应用程序来说,遍历n个记录也不实用;我希望有一个替代方案,但看起来我必须实施这一点。

9q78igpj

9q78igpj4#

请尝试以下代码:

$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();
    }
}
thtygnil

thtygnil5#

当您尝试将多行更新为相同的值时,将使用批量更新。不能使用不同的值进行批量更新。
因此,这将起作用,但会将所有匹配的记录更新为“tarun”名称:

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

例如,您可以:

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

但据我所知,如果不在laravel中运行4个查询并编写一个原始sql语句来完成这一任务,就无法做到这一点,这甚至会很麻烦。

相关问题