【问题标题】:Laravel - Commit dynamically created collection to database for a given modelLaravel - 将动态创建的集合提交给给定模型的数据库
【发布时间】:2019-02-05 19:08:05
【问题描述】:

我在 Laravel 中使用以下方法创建了一个集合:

use Illuminate\Database\Eloquent\Collection; // As per Mihir Bhende's answer, make sure we're using the correct Eloquent `Collection`

$collection = new Collection;

然后我继续将多个项目(所有相同的模型类型)推送到该集合中:

$item = $items->first(function($item) {
    return $item->field == "value";
});

$collection->push($item);

最后,我尝试使用$collection->update()$collection->save() 更新$collection 中的所有记录,但我收到以下错误:

“方法 Illuminate\Support\Collection::update 不存在。”

但是由于我使用的是new Collection(我也尝试过collect()),并且我非静态地调用update(),所以我没想到会出现这个错误。

如何一次更新$collection 中的数据库记录? 或者,有没有一种方法可以将多个不同子对象的更改“排队”而不牺牲性能? p>

谢谢!

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案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

    【讨论】:

      【解决方案2】:

      当你使用 collect([]) 时,它创建了Illuminate\Support\Collection,其中我们可以使用数据库更新函数的 eloquent 模型是Illuminate\Database\Eloquent\Collection

      您可以使用 Model::hydrate($array) 将数组转换为 eloquent 集合。

      但如果您尝试保存多条记录,请参阅Model::create()Model::update()。硒documentation

      【讨论】:

      • 哦!我没有意识到有两个单独的 Collection 类。我现在更新了我的代码以使用 Eloquent Collection,但我现在收到了同样的错误:Method Illuminate\Database\Eloquent\Collection::update does not exist. 而不是设置$collection = new Collection;,我更新的代码现在运行$collection = Model::hydrate($array_of_items);,然后直接运行@ 987654331@,所以我不确定为什么会收到此错误。
      • 好吧,我无法克服这个错误,所以我使用了 John Eriksson 的回答中的DB::transaction
      猜你喜欢
      • 2018-02-14
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多