Как использовать готовую загрузку на Laravel модели с суммой отношений - в настоящее время получает несколько запросов (N + 1) - PullRequest
1 голос
/ 22 февраля 2020

В моей модели я добавляю SUM-вычисление отношения, которое вызывает 80 запросов для атрибутов projectHours.

Если я не добавляю projectHours, я получаю 6 запросов.

Я считаю, что это проблема N + 1 в модели для отношений.

Есть ли какой-нибудь способ использовать стремительную загрузку в модели, чтобы уменьшить мои запросы?

Или я должен пойти по другому пути? Мне было предложено преобразовать это в Resource и обернуть запрос eager-load в область видимости, чтобы вы могли сделать это в своем контроллере, но я подумал, что ресурсы были больше для конечных точек API.

Спасибо за помощь.


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');
    }

}

1 Ответ

1 голос
/ 22 февраля 2020

Итак, ваше (N + 1) исходит прямо отсюда:

$this->jobs()->sum('hours');

Это вызвано доступом из-за ваших jobs отношений как экземпляра построителя запросов jobs()

Если Вы хотите предварительно загрузить отношения и затем суммировать результаты, вы можете сделать это следующим образом:

$this->jobs->sum('hours');

Затем используется метод Eloquent Collection sum


Пример

$project = Project::with('jobs')->find(1);

$hours = $project->projectHours;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...