laravel - 在 laravel 中通过模型关系更新所有记录
问题描述
class ModelA {
public function modelB()
{
return $this->hasMany(ModelB::class);
}
}
class ModelB {
public function modelC()
{
return $this->hasMany(ModelC::class);
}
}
class ModelC {
public function modelD()
{
return $this->hasMany(ModelD::class);
}
}
class ModelD {
//has column status_changed_date
}
我有$modelA = ModelA::find($id);
ModelA 有多个 ModelB,ModelB 有多个 ModelC,ModelC 有多个 ModelD。现在我想更新所有匹配记录的 status_changed_date 。有没有更好的方法来做到这一点。我参考了https://laravel.com/docs/5.7/eloquent-relationships#updating-many-to-many-relationships
但找不到解决方案。请帮助解决这个问题。
解决方案
$modelAs = ModelA::with('modelB.modelC.modelD')->find($id)
在你可以使用这种方式之前:
$modelA->modelB->each->modelC->each->modelC->each->update([
'field' => 'value'
]);
或将值减少为 id,这仅进行了一次查询:
$ids = [];
$modelA->modelB->each->modelC->each->modelC->each(function ($c) use($ids) {
$ids[] = $c->id;
});
ModelC::whereIn('id', $ids)->update([
'field' => 'value'
});
如果each->modelC->each
不起作用,请使用方法符号
推荐阅读
- typescript - 将图像作为填充图案应用到多边形不会改变其样式
- node.js - 密码恢复未将 req.body.email 传递给 POST
- json - PostgreSQL json 的字符随 [] 变化
- reactjs - react build with gh-pages 生成错误的静态文件路径
- node.js - React中从父级到子级的回调函数
- mysql - 使用变量对 MySQL 表进行排序
- html - CSS翻转卡在过渡完成之前不显示背面相关子元素
- vue.js - 如何在没有任何错误的情况下将其他 JavaScript 文件连接到 Vue 文件?
- javascript - 如何在发出的 Highcharts 选择事件回调函数中获取角度组件类引用?
- r - 在R中用ggplot指定另一列的轴顺序