我想大规模更新我的记录,但记录没有得到更新。我有一个不同的记录,每个id。下面是我正在尝试的。
$ids = [5,6,8,9], $updated_array = [ ['name' => 'tarun'], ['name' => 'Akash'], ['name' => 'Soniya'], ['name' => 'Shalu'], ]; Model::whereIn('id', $ids)->update($updated_array);
rks48beu1#
以下是解决这个问题的一些好办法:https://github.com/laravel/ideas/issues/5751) 可以根据帖子中的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注:我没有尝试或测试上述任何解决方案。
3wabscal2#
你可以这样做上面mentioned:-
foreach($ids as $key => $id) { Model::where('id', $id)->update($updated_array[$key]); }
w9apscun3#
我认为没有n个查询的唯一方法是(可选)备份表抓取记录并创建一个包含所有更新数据的数组批量删除记录从数组批量插入这是3个查询。对我的应用程序来说,遍历n个记录也不实用;我希望有一个替代方案,但看起来我必须实施这一点。
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(); } }
thtygnil5#
当您尝试将多行更新为相同的值时,将使用批量更新。不能使用不同的值进行批量更新。因此,这将起作用,但会将所有匹配的记录更新为“tarun”名称:
Model::whereIn('id', $ids)->update(['name' => 'tarun']);
例如,您可以:
但据我所知,如果不在laravel中运行4个查询并编写一个原始sql语句来完成这一任务,就无法做到这一点,这甚至会很麻烦。
5条答案
按热度按时间rks48beu1#
以下是解决这个问题的一些好办法:https://github.com/laravel/ideas/issues/575
1) 可以根据帖子中的barryvdh注解创建自定义函数来实现这一点,它使用原始sql。
这显然将性能提高了13倍
2) 根据另一条评论,另一个想法是在每个记录的基础上进行,但将整个事务作为单个事务进行,这样做会更快。
3) 有一个拉拉维尔图书馆似乎也试图解决这个问题。https://github.com/mavinoo/laravelbatch
注:我没有尝试或测试上述任何解决方案。
3wabscal2#
你可以这样做上面mentioned:-
w9apscun3#
我认为没有n个查询的唯一方法是
(可选)备份表
抓取记录并创建一个包含所有更新数据的数组
批量删除记录
从数组批量插入
这是3个查询。
对我的应用程序来说,遍历n个记录也不实用;我希望有一个替代方案,但看起来我必须实施这一点。
9q78igpj4#
请尝试以下代码:
thtygnil5#
当您尝试将多行更新为相同的值时,将使用批量更新。不能使用不同的值进行批量更新。
因此,这将起作用,但会将所有匹配的记录更新为“tarun”名称:
例如,您可以:
但据我所知,如果不在laravel中运行4个查询并编写一个原始sql语句来完成这一任务,就无法做到这一点,这甚至会很麻烦。