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

CakePHP - Pagination total count differs from actual count when using DISTINCT

我有一个使用 DISTINCT 子句从我的模型中获取结果的查找方法。控制器代码如下所示

$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

上面的查询return 6 个不同的行和 12 个总行。所以当我显示时,屏幕显示 6 个不同的行

但是在视图中,当我使用

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

我数到 12

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

找到解决方案,

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

    $选项=数组( 'conditions' => $条件, 'joins' => $加入, 'limit' => 10, 'fields' => 数组( 'DISTINCT Car.id', 'title', 'user_id'), 'contain' => 数组( 'Dealer' => 数组('id'), ), 'paramType' => 'querystring', 'distinct' => 'Car.id' );

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

  2. 在模型中,使用下面的函数覆盖原来的paginateCount方法

    public 函数 paginateCount($conditions = null, $recursive = 0, $extra = array()) { $parameters = compact('conditions', 'recursive'); 如果(isset($extra['distinct'])){ $参数['fields'] = 'DISTINCT ' 。 $额外['distinct']; $count = $this->find('count', array_merge($parameters, $extra)); } 别的 { // 常规分页 $count = $this->find('count', array_merge($parameters, $extra)); } return $计数; }

  3. 视图无变化