首页 文章

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

提问于
浏览
5

我试图在laravel 5.2中使用带有 pagination()pagination() ,并且给出了适当的结果,但是分页保持相同(就像没有应用的那样) .

I have already reviewed and tested below answers with mine code

我的代码是这样的:

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

EXAMPLE

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

任何建议将不胜感激!

3 回答

  • 0

    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.*']);
    
  • 4

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

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

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

    如果这不适合你,请告诉我:)

  • 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.*']);
    

    Need suggestion
    如果,我破解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,
        ]);
    }
    

相关问题