Eloquent - 更新集合中的所有模型

时间:2015-02-05 17:07:42

标签: php laravel eloquent

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

在纯SQL中:

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

我的代码:

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

取自here

但不起作用。我正在

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

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

2 个答案:

答案 0 :(得分:19)

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

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

whereIn将查询您的案例id中的列,第二个参数是您要返回的ID数组,但不会执行查询。您正在使用的findMany正在执行它,从而返回模型集合。

如果你需要让模型用于其他东西你可以$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方法。

答案 1 :(得分:4)

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

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,则最后一个示例(仅限最后一个示例)很有用。其他提出的解决方案直接涉及数据库,但模型没有被唤醒。