CakePHP - 使用DISTINCT时,分页总计数与实际计数不同

时间:2015-03-04 17:42:27

标签: php pagination cakephp-2.0

我有一个使用DISTINCT子句从我的模型中获取结果的find方法。 Controller代码如下所示

$options = array(
    'limit' => 10,
    'fields' => array(
        'DISTINCT id', 'title', 
    ),
    'contain' => array(
        'Dealer' => array('id'),
    ),
    'paramType' => 'querystring'
);

$this->Paginator->settings = $options;
$cars = $this->Paginator->paginate('Car'); // returns 6 distinct rows

上述查询返回6个不同的行和12个总行。因此,当我显示时,屏幕显示6个不同的行

但在视图中,当我使用

echo $this->Paginator->param('count'); // returns 12

我算了12个

我检查了SQL日志,发现计数查询没有使用distinct子句。知道如何覆盖Paginator计数查询以使用DISTINCT子句吗?

1 个答案:

答案 0 :(得分:0)

找到解决方案,

  1. 在控制器中,将distinct作为数组参数添加到其他分页选项中。因此,如果我试图在我的库存中一次检索10辆汽车的汽车列表,那么选项将在fields参数中有一个DISTINCT子句,并且还会添加一个名为distinct的单独参数,如下所示

    $ options = array(     'conditions'=> $条件,     'joins'=> $连接,     'limit'=> 10,     'fields'=>阵列(         'DISTINCT Car.id','title','user_id'),     'contains'=>阵列(         '经销商'=>阵列( 'ID'),     )     'paramType'=> '请求参数',     'distinct'=> 'Car.id' );

    $ this-> Paginator-> settings = $ options; $ cars = $ this-> Paginator-> paginate('Car');

  2. 在模型中,使用以下函数覆盖原始paginateCount方法

    public function paginateCount($ conditions = null,$ recursive = 0,$ extra = array()){     $ parameters = compact('conditions','recursive');     if(isset($ extra ['distinct'])){        $ parameters ['fields'] ='DISTINCT'。 $额外[ '不同'];        $ count = $ this-> find('count',array_merge($ parameters,$ extra));     } else {        //定期分页        $ count = $ this-> find('count',array_merge($ parameters,$ extra));     }     返回$ count; }

  3. 视图

  4. 无变化