雄辩 - 更新集合中的所有模型

2022-08-30 18:48:22

我想在集合的所有模型中设置某个属性。

在普通 SQL 中:

UPDATE table SET att = 'foo' WHERE id in (1,2,3)

我有的代码:

$models = MyModel::findMany([1,2,3]);
$models->update(['att'=>'foo']);

取自此处

但不起作用。我得到

Call to undefined method Illuminate\Database\Eloquent\Collection::update()

我发现它的唯一方法是使用查询构建器构建查询,但我宁愿避免这种情况。


答案 1

您返回的是集合,而不是使查询保持打开状态以进行更新。就像你的例子正在做的那样。

$models = MyModel::whereIn('id',[1,2,3]);
$models->update(['att'=>'foo']);

whereIn将查询一列,在你的情况下,第二个参数是你想要返回的id的数组,但不会执行查询。您正在使用的正在执行它,从而返回模型集合。idfindMany

如果您需要将模型用于其他操作,则可以执行该操作,它将返回模型的集合。$collection = $models->get();

如果你不只是简单地把它写在一行上;

MyModel::whereIn('id',[1,2,3])->update(['att'=>'foo']);

我不推荐的另一个选项是使用以下;

$models = MyModel::findMany([1,2,3]);

$models->each(function ($item){
    $item->update(['att'=>'foo']);
});

这将遍历集合中的所有项并单独更新它们。但我推荐这种方法。whereIn


答案 2

单个查询中的最佳解决方案仍然是:

MyModel::whereIn('id',[1,2,3])->update(['att'=>'foo']);

如果您已经有一个模型集合,并且想要进行直接更新,则可以使用方法。请注意,在进行此更新后,您的集合仍然过时,您可能需要刷新它:modelKeys()$models

MyModel::whereIn('id', $models->modelKeys())->update(['att'=>'foo']);
$models = MyModel::findMany($models->modelKeys());

我不建议使用下一个示例,因为对于集合的每个项目,都会执行一个新的额外查询:$models

$models->each(function ($item) {
    $item->update(['att'=>'foo']);
});

或者更简单,从Laravel 5.4你可以做$models->each->update(['att'=>'foo']);

但是,最后一个示例(并且仅最后一个)在您想要触发某些模型事件(如 、 、 、 、 .其他提出的解决方案直接涉及数据库,但模型没有被唤醒。savingsavedupdatingupdated


推荐