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
子句吗?
找到解决方案,
在控制器中添加 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');
在模型中,使用下面的函数覆盖原来的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 $计数;
}
视图无变化
我有一个使用 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
子句吗?
找到解决方案,
在控制器中添加 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');
在模型中,使用下面的函数覆盖原来的
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 $计数; }
视图无变化