Mysql 在ORDER子句中使用FIELD()的CakePHP 3分页器
我有一个关于CakePHP3(3.0.13)的分页器组件的问题。我正在使用MYSQL函数Mysql 在ORDER子句中使用FIELD()的CakePHP 3分页器,mysql,cakephp,pagination,cakephp-3.0,Mysql,Cakephp,Pagination,Cakephp 3.0,我有一个关于CakePHP3(3.0.13)的分页器组件的问题。我正在使用MYSQL函数FIELD()对数据进行排序,如下所示: $this->paginate = array_merge_recursive([ 'conditions' => [ 'zip IN' => $zips ], 'order' => [ 'FIELD(zip, '.rtrim(implode
FIELD()
对数据进行排序,如下所示:
$this->paginate = array_merge_recursive([
'conditions' => [
'zip IN' => $zips
],
'order' => [
'FIELD(zip, '.rtrim(implode(',', $zips), ',').')',
'ispro' => 'desc',
],
$this->paginate
]);
当我将其应用于我的$this->paginate()
时,只要设置了查询参数sort
,它就不会被识别。为了避免这种情况,我删除了请求中的排序
:
if (isset($this->request->query['sort'])) {
unset($this->request->query['sort']);
}
这是可行的,但我想知道是否有更好的解决方案,可能是在分页器组件本身,我还没有找到。您可以在分页之前对查询进行排序。排序条件将出现在从paginator组件附加的条件之前 所以你可以
$dentists = $this->Dentists->find()
->order([
'FIELD(zip, '.rtrim(implode(',', $zips), ',').')',
'ispro' => 'desc'
]);
$this->paginate = array_merge_recursive([
'conditions' => [
'zip IN' => $zips
],
$this->paginate
]);
$dentists = $this->paginate($dentists);
请提及您的cakephp版本。另外,在使用FIELD()函数的地方张贴代码我正在使用cake 3.0.13。我想你应该将计算字段添加到SortHitelist选项中,你的意思是像
$this->paginate('SortHitelist'=>['zip'])代码>?已经尝试过了,但不起作用。您正在创建一个新的计算字段。所以你应该做$this->paginate('sortWhitelist'=>['FIELD(zip,'.rtrim(introde(',','zips),',',')。))]
好主意。所以Paginator会将结果集$dentists并对其进行分页,而不是单独执行find(),对吗?对。实际上,$dentist
是一个查询对象(不是记录集),只需将获得的另一个$query对象附加到$dentists