distinct()with pagination()在laravel 5.2中不起作用

时间:2016-12-22 12:21:31

标签: php laravel pagination laravel-5.2 fluent

我试图在 laravel 5.2 distinct()使用pagination(),并且说明结果正确,但分页保持不变(如没有适用不同的。)

我已经使用我的代码审核并测试了以下答案
- laravel 5 - paginate total() of a query with distinct
- Paginate & Distinct
- Query Builder paginate method count number wrong when using distinct

我的代码类似于:

DB::table('myTable1 AS T1')
->select('T1.*')
->join('myTable2 AS T2','T2.T1_id','=','T1.id')
->distinct()
->paginate(5);

示例
- 我有三条记录的结果(即 POST1,POST2,POST3 POST1 ),所以我申请distinct()
- 现在我的结果是 POST1,POST2 POST3 ,但分页仍然显示为4条记录(在应用distinct()之前的结果)。

任何建议都将不胜感激!

6 个答案:

答案 0 :(得分:4)

Laravel似乎存在一些问题,并且使用不同的分页。

在这种情况下,当分页确定记录总数时,它会忽略您在select()子句中指定的字段。由于它忽略了您的列,因此也会忽略不同的功能。因此,计数查询变为select count(*) as aggregate from ...

要解决此问题,您需要告诉paginate函数您的列。传递您的列数组以选择作为第二个参数,并将它们考虑为总计数。所以,如果你这样做:

/*DB::stuff*/->paginate(5, ['T1.*']);

这将运行计数查询:

select count(distinct T1.*) as aggregate from

因此,您的查询应如下所示:

DB::table('myTable1 AS T1')
    ->select('T1.*')
    ->join('myTable2 AS T2','T2.T1_id','=','T1.id')
    ->distinct()
    ->paginate(5, ['T1.*']);

答案 1 :(得分:4)

如果可能,可以用distinct()来更改groupBy()

答案 2 :(得分:1)

使用 groupBy()代替 distinct()。我还没有测试过,但是可以使用。我在查询中遇到了同样的问题。

$author = Author::select('author_name')->groupBy('author_name')->paginate(15); 

答案 3 :(得分:0)

distinct正在工作....当你进行连接时,它会检查所有选定列中的不同条目,这里..连接后得到的列名也包含在连接中...

要运行此操作,请将select()添加到您的构建器实例,它应该可以正常工作:)

DB::table('myTable1 AS T1')
  ->join('myTable2 AS T2','T2.T1_id','=','T1.id')
  ->select('T1.*')
  ->distinct()
  ->paginate(5);

如果这对你不起作用,请告诉我:)。

答案 4 :(得分:0)

我在代码中发现了问题,即我需要将$column作为第二个参数传递给paginate($perPage, $columns, $pageName, $page)。我从laravel git issue获得了解决方案。

所以我的工作代码:

DB::table('myTable1 AS T1')
->select('T1.*')
->join('myTable2 AS T2','T2.T1_id','=','T1.id')
->distinct()
->paginate(5, ['T1.*']);

需要建议
如果,我破解Builder.php的代码绕过传递第二个参数$column,该怎么办?我的意思是这是好事还是任何击球选项?

/**
 * Paginate the given query into a simple paginator.
 *
 * @param  int  $perPage
 * @param  array  $columns
 * @param  string  $pageName
 * @param  int|null  $page
 * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
 */
public function paginate($perPage = 15, $columns = null, $pageName = 'page', $page = null)
{

    //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 = ['*'];
        }
    }

    $page = $page ?: Paginator::resolveCurrentPage($pageName);

    $total = $this->getCountForPagination($columns);

    $results = $total ? $this->forPage($page, $perPage)->get($columns) : [];

    return new LengthAwarePaginator($results, $total, $perPage, $page, [
        'path' => Paginator::resolveCurrentPath(),
        'pageName' => $pageName,
    ]);
}

答案 5 :(得分:0)

使用 groupby 和 paginate 去除重复