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
но не смог найти решение.
Пожалуйста, помогите решить это.
да, но как я могу обновить свое поле в ModelD?






$modelAs = ModelA::with('modelB.modelC.modelD')->find($id)
прежде чем вы сможете использовать этот способ:
$modelA->modelB->each->modelC->each->modelC->each->update([
'field' => 'value'
]);
или уменьшить значения до идентификаторов, это сделало только один запрос:
$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 не работает, используйте обозначение метода
Позвольте мне попробовать это
Это много зацикливается. :(
Для первого метода, но второй более эффективен, потому что в конце есть только один запрос (я добавил оператор использования в функцию)
Вместо того, чтобы делать все эти обновления, создайте одну общую таблицу общих полей и непосредственно обновите эту таблицу.
Вы можете попробовать вложенные отношения:
ModelA::with('modelB.modelC.modelD')->find($id);