【问题标题】:CakePHP 3 Paginator using FIELD() in ORDER clauseCakePHP 3 Paginator 在 ORDER 子句中使用 FIELD()
【发布时间】:2016-02-17 14:57:17
【问题描述】:

我有一个关于 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,它就不会被识别。为了避免这种情况,我删除了我的请求中的sort

if (isset($this->request->query['sort'])) {
      unset($this->request->query['sort']);
}

这是可行的,但我想知道是否有更好的解决方案,可能在分页器组件本身中,我还没有找到。

【问题讨论】:

  • 请提及您的 cakephp 版本。还要贴出你使用 FIELD() 函数的代码
  • 我用的是 cake 3.0.13。
  • 我想您应该将计算字段添加到 sortWhitelist 选项
  • 你的意思是像$this->paginate('sortWhitelist' =>[ 'zip']);?已经试过了,但是不行。
  • 您正在创建一个新的计算字段。所以你应该做$this->paginate('sortWhitelist' =>[ 'FIELD(zip, '.rtrim(implode(',', $zips), ',').')'])

标签: mysql cakephp pagination cakephp-3.0


【解决方案1】:

您可以在分页之前对查询进行排序。您的排序条件将出现在分页器组件附加的条件之前

这样你就可以了

$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);

【讨论】:

  • 好主意。所以 Paginator 会使用 resultSet $dentists 并对其进行分页,而不是自己执行 find(),对吗?
  • 正确。实际上$dentist 是一个查询对象(不是记录集),paginate() 只是将另一个 $query 对象返回给$dentists 获得的附加顺序和页面条件
猜你喜欢
  • 2013-11-10
  • 2013-04-09
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多