У меня есть рабочие места и проекты на моем Laravel сайте, и между ними есть отношения. Я пытаюсь уменьшить количество сделанных запросов (и помнить о проблеме N + 1). Я делаю это с энергичной загрузкой в моем контроллере при выводе моих JobItems.
Как я могу сделать это, когда я вкладываю: JobItems> Project> JobItems.
В одном случае это происходит, и я Я получаю повторяющиеся запросы. Я не уверен, как стремиться загрузить. Я обрисую ситуацию следующим образом:
Каждый JobItem имеет столбец для часов.
В моем проекте я СУММАЮ все связанные часы JobItem, чтобы определить общее количество часов в проекте. (Например, 3 JobItems по 4 часа каждый, в моей модели проекта есть аксессор, который говорит, что projectHours = 12).
- job
- project
- project_hours (Сумма связанных заданий)
Я хочу перечислить все JobItems и каждый JobItem, чтобы иметь дочерний элемент соответствующего Project.
Итак, я звоню:
- Модель JobItem
- Модель проекта (для дочернего элемента в JobItem)
- Модель JobItem (для расчета общее количество часов в модели проекта)
На этом шаге 3 я получаю проблему N + 1 и несколько повторяющихся запросов. Я хотел бы уменьшить это с энергичной загрузкой, но не уверен, как, если я (на шаге 1) уже вызываю модель JobItem.
В моем контроллере у меня есть:
public function getJobItems()
{
$userId = auth()->user()->id;
return JobItem::whereHas('project', function ($query) use ($userId) {
$query->where('user_id', '=', $userId);
})->with(['project', 'user'])
->get();
}
В моей модели проекта у меня есть:
class Project extends Model
{
protected $appends = ['projectHours'];
public function jobs()
{
return $this->hasMany('App\JobItem', 'project_id', 'id');
}
public function getProjectHoursAttribute()
{
return $this->jobs->sum('hours');
}
}
Как всегда, если я подхожу к этому неправильно, дайте мне знать. Очень ценится.
NB. Это связано с этой заявкой SO о сокращении запросов с помощью Eager Loading: Как использовать нетерпеливую загрузку на Laravel модели с SUM отношения - в настоящее время получают несколько запросов (N + 1)