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
但找不到解决方案。
请帮助解决此问题。
答案 0 :(得分:0)
$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
不起作用,请使用方法符号
答案 1 :(得分:0)
而不是进行所有此更新,而是创建一个包含公用字段的公用表并直接更新该表。