CakePHP 3.0 中虚拟字段/实体属性的分页排序链接 [英] Pagination sort link on a virtual field/entity property in CakePHP 3.0

查看:25
本文介绍了CakePHP 3.0 中虚拟字段/实体属性的分页排序链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个分页排序链接 关于虚拟字段/实体属性a> 在 CakePHP 3.0 中.

I want to create a pagination sort link on a virtual field/entity property in CakePHP 3.0.

在 CakePHP 2.x 中,我曾经创建一个 虚拟字段,然后在该字段上创建分页排序链接.但是,在 CakePHP 3.0 中,虚拟字段 已被替换为 虚拟实体属性.

In CakePHP 2.x I used to create a virtual field, and then create a pagination sort link on that field. However, in CakePHP 3.0, virtual fields have been replaced by virtual entity properties.

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

Is there any way I can get this working in CakePHP 3.0?

在我的情况下,我有一个 first_name 和 last_name 列,它们在 虚拟实体属性.我想按 full_name 排序.

In my situation, I have a first_name and last_name column, which are combined as full_name in a virtual entity property. I want to sort on the full_name.

推荐答案

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

As stated in the linked docs, virtual properties cannot be used in finds. That's by design, virtual properties only live in entities, they are built in PHP after data has been retrieved from the database.

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

So let's forget about virtual properties for a moment, and concentrate on queries and computed columns.

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

Just like columns of associated models, computed columns need to be specified in the sortWhitelist option in order to be useable for sorting!

Cookbook > Controllers > Components > Pagination > 控制用于排序的字段

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

You have some options here, for example you could define computed columns in the pagination options:

$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'
    ]
];

自定义查找器

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

A custom finder

Another, more reusable option would be to use a custom finder:

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

public function findWithFullName(CakeORMQuery $query, array $options)
{
    return $query->select([
        'id',
        'first_name',
        'last_name',
        'full_name' => $query->func()->concat([
            'first_name' => 'literal',
            'last_name' => 'literal'
        ]),
        // ...
    ]);
}

  • 食谱> 控制器>组件 > 分页 > 使用 Controller::paginate()
  • Cookbook > ... ORM > 检索数据 &结果集 > 自定义查找器方法
  • 也可以直接将查询对象传递给Controller::paginate():

    It's also possible to directly pass query objects to Controller::paginate():

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

    这篇关于CakePHP 3.0 中虚拟字段/实体属性的分页排序链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆