Laravel-将给定模型的动态创建的集合提交到数据库

时间:2019-02-05 19:08:05

标签: php laravel laravel-5

我使用以下方法在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}}中的数据库记录?或者,是否可以“排队”对多个不同的子对象进行更改而不牺牲性能?

谢谢!

2 个答案:

答案 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