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

新手上路,请多包涵

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

在普通 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()

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

原文由 Jarry 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 262
2 个回答

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

 $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 方法。

原文由 Matt Burrow 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 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']);

However, the last example (and only the last) is good when you want to trigger some model events like saving , saved , updating , updated 。其他提出的解决方案直接接触数据库,但模型没有被唤醒。

原文由 Marcel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏