我使用以下方法在Laravel中创建了一个集合:
$item = $items->first(function($item) {
return $item->field == "value";
});
$collection->push($item);
然后我继续将多个项目(所有相同模型类型)推入该集合:
$collection
最后,我尝试使用$collection->update()
或$collection->save()
更新new Collection
中现在的所有记录,但收到以下错误:
“方法Illuminate \ Support \ Collection :: update不存在。”
但是由于我正在使用collect()
(并且我也尝试过update()
),并且我非静态地调用$collection
,所以我没想到会出现此错误。 / p>
如何一次全部更新{{1}}中的数据库记录?或者,是否可以“排队”对多个不同的子对象进行更改而不牺牲性能?
谢谢!
答案 0 :(得分:1)
当您使用collect([])时,它会创建Illuminate\Support\Collection
,其中可以使用数据库更新功能的雄辩模型是Illuminate\Database\Eloquent\Collection
您可以使用Model :: hydrate($ array)将数组转换为雄辩的集合。
但是,如果您要保存多个记录,请参见Model::create()
或Model::update()
。 Se documentation
答案 1 :(得分:1)
您可以使用事务“排队”更新模型并确保原子更新。
DB::transaction (function () use ($collection) {
$collection->each(function ($item) {
$item->save();
});
});
当然,最好的方法是在事务闭包中执行逻辑,因此您无需多次循环它们:
DB::transaction(function () {
$items->each(function ($item) {
$item->field = "value";
$item->save();
});
});
这样,您无需多次遍历集合。
请参阅有关交易的Laravel文档:https://laravel.com/docs/5.6/database#database-transactions