首页 > 解决方案 > 在 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 但找不到解决方案。请帮助解决这个问题。

标签: laravel

解决方案


$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不起作用,请使用方法符号


推荐阅读