Mysql 在ORDER子句中使用FIELD()的CakePHP 3分页器

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

我有一个关于CakePHP3(3.0.13)的分页器组件的问题。我正在使用MYSQL函数
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