Laravel Стремительная загрузка для модели отношений - невозможно уменьшить количество запросов, пока я не верну ноль - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь уменьшить количество запросов к базе данных при извлечении из базы данных с помощью Eloquent.

Я пытаюсь воспользоваться возможностью быстрой загрузки, чтобы уменьшить количество запросов и не получить проблему N + 1. У меня также есть некоторые отношения в моих моделях.

Я заметил (и я не уверен, что это красная сельдь), что если я просто верну null из моего метода контроллера, то получу 6 запросов. Что указывало бы на готовность работать. Но я получаю 492 запроса, когда возвращаю результат переменной eloquent. НАПРИМЕР. В моем контроллере:

    public function getJobItems()
    {

        $userId = auth()->user()->id;


        $jobs = JobItem::with(['project', 'user'])
            ->whereHas('project', function ($query) use ($userId) {
                $query->where('user_id', '=', $userId);
            })
            ->get();

        return $jobs;

    }

Если я изменяю return $ jobs; просто вернуться; тогда я вижу только 6 запросов (показано с помощью Laravel Telescope). Я не уверен, как вывод переменной $ jobs изменяет запросы к БД. Вот что я получаю из инспектора запросов телескопа для этих 6 запросов:

update `sessions` set `payload` =...        
select `users`.*, `projects`.`user_id` as `laravel_through_key` from `users` inner join `projects` on...    
select * from `projects` where `projects`.`id` in (5, 9, 15, 111, 116, 117, 118, 119, 123, 124) and...  
select * from `job_items` where exists (select * from `projects` where `job_items`.`project_id` =...    
select * from `users` where `id` = 1 and `users`.`deleted_at`
select * from `sessions` where `id` = 'acx7zPzeeRVrtI5FTUGUbULm1bEVQ0T5AVylFIf6'

Когда я использую return $ jobs; Я получил 492 запроса, и телескоп объясняет, что 484 дубликаты. Например, варианты:

select * from `projects` where `projects`.`id` = 15 and `projects`.`deleted_at` is null limit 1

В моей модели JobItem у меня есть следующее:


    public function project()
    {
        return $this->belongsTo('App\Project', 'project_id');
    }


    public function user()
    {

        return $this->hasOneThrough(
            User::class,
            Project::class,
            'user_id',
            'id',
            'project_id',
            'id'
        );
    }

У меня есть следующие таблицы:

table: job_items
columns: id, project_id

table: projects
columns: id, user_id

table: users
column: id

Я хочу выводить всех пользователей, подключенных к JobItems

В моей модели JobItem. php, которую я пробовал

class JobItem extends Model
{

    public function user()
    {


        return $this->hasOneThrough(
            Project::class,
            User::class,
            'project_id',
            'id',
            'belongs_to',
            'user_id'
        );

    }
}

Будем благодарны за любые идеи о том, как уменьшить количество запросов с этими моделями. Спасибо

1 Ответ

0 голосов
/ 20 февраля 2020

Измените ваш контроллер на этот.

public function getJobItems()
{

        $userId = auth()->user()->id;


        $jobs = JobItem::whereHas('project', function ($query) use ($userId) {
                $query->where('user_id', '=', $userId);
            })->with(['project', 'user'])->get();

        return $jobs;

}

Это может быть из-за того, что порядок ваших whereHas должен быть перед вами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...