Php Laravel急切加载关系模型-除非返回null,否则无法减少查询
我试图在使用Eloquent从数据库检索时减少数据库查询 我试图利用急于加载的优势来减少查询,而不是解决N+1问题。。我的模型中也有一些关系 我已经注意到(我不确定这是否是一条红鲱鱼),如果我只是从我的控制器方法返回null,那么我会得到6个查询。这将表明正在工作。但是当我返回雄辩变量的结果时,我得到492个查询。例如,在我的控制器中:Php Laravel急切加载关系模型-除非返回null,否则无法减少查询,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我试图在使用Eloquent从数据库检索时减少数据库查询 我试图利用急于加载的优势来减少查询,而不是解决N+1问题。。我的模型中也有一些关系 我已经注意到(我不确定这是否是一条红鲱鱼),如果我只是从我的控制器方法返回null,那么我会得到6个查询。这将表明正在工作。但是当我返回雄辩变量的结果时,我得到492个查询。例如,在我的控制器中: public function getJobItems() { $userId = auth()->user()->
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;
}
如果我换了工作,返回$jobs;刚刚回来;然后我只能看到6个查询(用拉威尔望远镜显示)。我不确定输出$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'
);
}
}
任何关于如何使用这些模型减少我的疑问的想法都将不胜感激。谢谢把你的控制器换成这个
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的顺序应该比您的要早。谢谢,但我尝试了,但没有解决问题:(