Я пытаюсь уменьшить количество запросов к базе данных при извлечении из базы данных с помощью 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'
);
}
}
Будем благодарны за любые идеи о том, как уменьшить количество запросов с этими моделями. Спасибо