Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel急切加载关系模型-除非返回null,否则无法减少查询_Php_Mysql_Laravel_Eloquent - Fatal编程技术网

Php Laravel急切加载关系模型-除非返回null,否则无法减少查询

Php Laravel急切加载关系模型-除非返回null,否则无法减少查询,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我试图在使用Eloquent从数据库检索时减少数据库查询 我试图利用急于加载的优势来减少查询,而不是解决N+1问题。。我的模型中也有一些关系 我已经注意到(我不确定这是否是一条红鲱鱼),如果我只是从我的控制器方法返回null,那么我会得到6个查询。这将表明正在工作。但是当我返回雄辩变量的结果时,我得到492个查询。例如,在我的控制器中: public function getJobItems() { $userId = auth()->user()->

我试图在使用Eloquent从数据库检索时减少数据库查询

我试图利用急于加载的优势来减少查询,而不是解决N+1问题。。我的模型中也有一些关系

我已经注意到(我不确定这是否是一条红鲱鱼),如果我只是从我的控制器方法返回null,那么我会得到6个查询。这将表明正在工作。但是当我返回雄辩变量的结果时,我得到492个查询。例如,在我的控制器中:

    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的顺序应该比您的要早。

谢谢,但我尝试了,但没有解决问题:(