通过Laravel中的模型关系船更新所有记录

时间:2019-02-25 08:11:58

标签: 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 但找不到解决方案。 请帮助解决此问题。

2 个答案:

答案 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)

而不是进行所有此更新,而是创建一个包含公用字段的公用表并直接更新该表。

更多
Laravel Polyformic relationships