gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:06:33 26 4
gpt4 key购买 nike

我想在CakePHP 3.0中的pagination sort link上创建virtual field/entity property

在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。我想对全名进行排序。

最佳答案

如链接文档中所述,虚拟属性不能在查找中使用。这是设计使然,虚拟属性仅存在于实体中,在从数据库中检索数据之后,它们是用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',
'first_name',
'last_name',
'full_name' => $this->Table->query()->func()->concat([
'first_name' => 'literal',
'last_name' => 'literal'
]),
// ...
],
'order' => [
'full_name' => 'DESC'
]
];

定制取景器

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

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

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'
]),
// ...
]);
}
  • Cookbook > Controllers > Components > Pagination > Using Controller::paginate()
  • Cookbook > ... ORM > Retrieving Data & Results Sets > Custom Finder Methods

  • 单独的自定义查询

    也可以将查询对象直接传递给 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);

    关于cakephp - CakePHP 3.0中虚拟字段/实体属性上的分页排序链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31763413/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com