Tij*_*jme 8 virtual pagination cakephp paginator jquery-ui-sortable
我想在CakePHP 3.0中的虚拟字段/实体属性上创建分页排序链接.
在CakePHP 2.x中,我曾经创建一个虚拟字段,然后在该字段上创建一个分页排序链接.但是,在CakePHP 3.0中,虚拟字段已被虚拟实体属性替换.
我有什么方法可以在CakePHP 3.0中使用它吗?
在我的情况下,我有一个first_name和last_name列,它们在虚拟实体属性中组合为full_name .我想对full_name进行排序.
ndm*_*ndm 20
如链接文档中所述,虚拟属性不能用于查找.这是设计的,虚拟属性只存在于实体中,它们是在从数据库中检索数据后用PHP构建的.
因此,让我们暂时忘记虚拟属性,并专注于查询和计算列.
sortWhitelist就像关联模型的列一样,需要在sortWhitelist选项中指定计算列,以便可用于排序!
这里有一些选项,例如您可以在分页选项中定义计算列:
$this->paginate = [
// ...
'sortWhitelist' => [
'id',
'first_name',
'last_name',
'full_name',
// ...
],
'fields' => [
'id',
'first_name',
'last_name',
'full_name' => $this->Table->query()->func()->concat([
'first_name' => 'literal',
'last_name' => 'literal'
]),
// ...
],
'order' => [
'full_name' => 'DESC'
]
];
Run Code Online (Sandbox Code Playgroud)
另一个更可重用的选项是使用自定义查找程序:
$this->paginate = [
// ...
'sortWhitelist' => [
'id',
'first_name',
'last_name',
'full_name',
// ...
],
'finder' => 'withFullName',
'order' => [
'full_name' => 'DESC'
]
];
Run Code Online (Sandbox Code Playgroud)
public function findWithFullName(\Cake\ORM\Query $query, array $options)
{
return $query->select([
'id',
'first_name',
'last_name',
'full_name' => $query->func()->concat([
'first_name' => 'literal',
'last_name' => 'literal'
]),
// ...
]);
}
Run Code Online (Sandbox Code Playgroud)
也可以直接将查询对象传递给Controller::paginate():
$this->paginate = [
// ...
'sortWhitelist' => [
'id',
'first_name',
'last_name',
'full_name',
// ...
],
'order' => [
'full_name' => 'DESC'
]
];
$query = $this->Table
->find()
->select(function (\Cake\ORM\Query $query) {
return [
'id',
'first_name',
'last_name',
'full_name' => $query->func()->concat([
'first_name' => 'literal',
'last_name' => 'literal'
]),
// ...
];
});
$results = $this->paginate($query);
Run Code Online (Sandbox Code Playgroud)