我想在Laravel中大规模更新我的记录,但是记录没有更新。每个ID都有不同的记录。以下是我正在尝试的方法。
$ids = [5,6,8,9],
$updated_array = [
['name' => 'tarun'],
['name' => 'Akash'],
['name' => 'Soniya'],
['name' => 'Shalu'],
];
Model::whereIn('id', $ids)->update($updated_array);
答案 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());