加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

CakePHP 3.0中虚拟字段/实体属性上的分页排序链接

发布时间:2020-12-13 18:22:22 所属栏目:PHP教程 来源:网络整理
导读:我想在Cake PHP 3.0中的 virtual field/entity property上创建一个 pagination sort link. 在CakePHP 2.x中,我曾经创建了一个virtual field,然后在该字段上创建了一个分页排序链接.但是,在CakePHP 3.0中,virtual fields已被virtual entity properties取代.
我想在Cake PHP 3.0中的 virtual field/entity property上创建一个 pagination sort link.

在CakePHP 2.x中,我曾经创建了一个virtual field,然后在该字段上创建了一个分页排序链接.但是,在CakePHP 3.0中,virtual fields已被virtual entity properties取代.

我有什么方法可以在CakePHP 3.0中使用它吗?

在我的情况下,我有一个first_name和last_name列,它们在virtual entity property中组合为full_name.我想对full_name进行排序.

如链接文档中所述,虚拟属性不能用于查找.这是设计的,虚拟属性只存在于实体中,它们是在从数据库中检索数据后用PHP构建的.

因此,让我们暂时忘记虚拟属性,并专注于查询和计算列.

需要通过sortWhitelist指定计算列

就像关联模型的列一样,需要在sortWhitelist选项中指定计算列,以便可用于排序!

Cookbook > Controllers > Components > Pagination > Control which Fields Used for Ordering

通过分页选项

这里有一些选项,例如您可以在分页选项中定义计算列:

$this->paginate = [
    // ...
    'sortWhitelist' => [
        'id','first_name','last_name','full_name',// ...
    ],'fields' => [
        'id','full_name' => $this->Table->query()->func()->concat([
            'first_name' => 'literal','last_name' => 'literal'
        ]),'order' => [
        'full_name' => 'DESC'
    ]
];

定制查找器

另一个更可重复使用的选项是使用自定义查找程序:

$this->paginate = [
    // ...
    'sortWhitelist' => [
        'id','finder' => 'withFullName','order' => [
        'full_name' => 'DESC'
    ]
];
public function findWithFullName(CakeORMQuery $query,array $options)
{
    return $query->select([
        'id','full_name' => $query->func()->concat([
            'first_name' => 'literal',// ...
    ]);
}

> Cookbook > Controllers > Components > Pagination > Using Controller::paginate()
> Cookbook > … ORM > Retrieving Data & Results Sets > Custom Finder Methods

单独的自定义查询

也可以直接将查询对象传递给Controller :: paginate():

$this->paginate = [
    // ...
    'sortWhitelist' => [
        'id','order' => [
        'full_name' => 'DESC'
    ]
];

$query = $this->Table
    ->find()
    ->select(function (CakeORMQuery $query) {
        return [
            'id','full_name' => $query->func()->concat([
                'first_name' => 'literal','last_name' => 'literal'
            ]),// ...
        ];
    });
$results = $this->paginate($query);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读