我有以下查询,我想选择不同的行。但是,分页器生成的计数查询似乎不是 添加distinct子句,以便我得到一个不正确的总数?
DB::enableQueryLog();
$jobs = Job::join('locations', 'locations.id', '=', 'jobs.location_id')
->join('job_industry', 'job_industry.job_id', '=', 'jobs.id')
->select('jobs.*', 'locations.name')
->distinct()
->paginate(5, 'jobs.id');
dd(DB::getQueryLog());
这是查询日志:
"query" => """
select count(*) as aggregate from `jobs`
inner join `locations` on `locations`.`id` = `jobs`.`location_id`
inner join `job_industry` on `job_industry`.`job_id` = `jobs`.`id`
"""
"query" => """
select distinct `jobs`.*, `locations`.`name` from `jobs`
inner join `locations` on `locations`.`id` = `jobs`.`location_id`
inner join `job_industry` on `job_industry`.`job_id` = `jobs`.`id`
limit 5 offset 0
"""
正如您所看到的,由paginator方法生成的计数查询不正确 - 它应该是COUNT(DISTINCT jobs.id) as aggregate...
我按照以下帖子(distinct() with pagination() in laravel 5.2 not working)的说明进行操作但是我无法在我的builder.php副本中找到上面帖子中引用的以下代码 - 这可以通过检查主仓库来确认: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Builder.php#L484
//To solved paginator issue with distinct...
if(is_null($columns) && strpos($this->toSql(), 'distinct') !== FALSE){
$columns = $this->columns;
$columns = array_filter($columns, function($value) {
return (is_string($value) && !empty($value));
});
}
else {
//If null $column, set with default one
if(is_null($columns)){
$columns = ['*'];
}
}
我尝试将上面的代码添加到builder.php文件中的我自己的paginate方法中,但它没有区别 - 我仍然得到相同的行为?
我该如何解决这个问题。我能克服这个问题的唯一方法是使用group by子句,但是它有自己的性能问题。