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

Вы можете попробовать вложенные отношения: ModelA::with('modelB.modelC.modelD')->find($id);

Julien METRAL 25.02.2019 09:23

да, но как я могу обновить свое поле в ModelD?

Sandeep Sudhakaran 25.02.2019 10:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
57
2

Ответы 2

$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 не работает, используйте обозначение метода

Позвольте мне попробовать это

Sandeep Sudhakaran 25.02.2019 11:35

Это много зацикливается. :(

Sandeep Sudhakaran 25.02.2019 11:51

Для первого метода, но второй более эффективен, потому что в конце есть только один запрос (я добавил оператор использования в функцию)

Julien METRAL 25.02.2019 11:52

Вместо того, чтобы делать все эти обновления, создайте одну общую таблицу общих полей и непосредственно обновите эту таблицу.

Больше
Полиформные отношения Laravel

Другие вопросы по теме