【问题标题】:Laravel 5.2 - Incorrect Pagination Total When using Distinct ClauseLaravel 5.2 - 使用不同子句时分页总数不正确
【发布时间】:2022-02-25 13:10:18
【问题描述】:

我有以下查询,我想在其中选择不同的行。但是分页器生成的计数查询似乎没有 添加 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
  """

如您所见,分页器方法生成的计数查询不正确-应该是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 文件中的分页方法中,但这没有任何区别 - 我仍然得到相同的行为?

我该如何解决这个问题。我可以克服这个问题的唯一方法是使用 group by 子句,但这有其自身的性能问题。

【问题讨论】:

  • 这里远射,但你能试着把括号放在里面吗? ->paginate(5, ['jobs.id']);
  • @Felippe Duarte 已经尝试过了,但它不起作用。除非有人有任何其他建议,否则我认为通过所有这些帖子都没有解决这个问题:github.com/laravel/framework/pull/4088
  • 一个建议是用 groupBy 方法替换 DISTINCT 子句。
  • @FelippeDuarte 你在这里拯救了一天!您的示例用 * 阐明了另一个不起作用的解决方案。非常感谢!

标签: php mysql pagination laravel-5.2


【解决方案1】:

我之前遇到过类似的问题。我通过这样做修复了它:

->distinct('jobs.id')
->paginate(5, 'jobs.id');

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 2018-01-21
    • 2016-07-19
    • 1970-01-01
    • 2014-05-29
    • 2016-05-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多