【问题标题】:How to sort a Cakephp query using a post calculated field and pass it to the paginate?如何使用后计算字段对 Cakephp 查询进行排序并将其传递给分页?
【发布时间】:2019-05-28 17:53:05
【问题描述】:

有一个 formatResults 回调函数,它将“自定义计算”字段添加到从我的 Cakephp 中的模型查询返回的实体帖子中。我想按此字段排序并在分页上使用它这可能吗?

到目前为止,我无法做到这一点,因为分页限制了获取的记录,因此只有小于分页器限制的记录才会被排序,而不是所有结果集......

当前代码:

    $owners = $this->Owners->find('all');

    $owners->formatResults(function (\Cake\Collection\CollectionInterface $owners) {

        $owners = $owners->map(function ($entity) {

            $entity->random = rand(0,1);

            return $entity;

        });

        return $owners->sortBy(function ($item){

            return $item->random;

        },SORT_DESC);

    });

这按预期工作:

$owners->toArray();

这不是:

$owners = $this->paginate($owners);
$owners->toArray();

主要是因为它的“回调处理”只有前 10 条记录,我想处理整个结果集。

【问题讨论】:

  • 要使分页工作,您需要在 SQL 查询中有 sort 子句。这看起来只是随机选择 10 个,这是实际用例还是只是一个示例?如果这确实是您所需要的,并且您的数据库中没有数百万行,那么 find('all')->order('rand()')->limit(10) 之类的东西应该可以工作。

标签: php cakephp paginator


【解决方案1】:

我在this link上发现了以前的用户打开的类似主题后,似乎无法在数据库中的字段以外的地方使用分页排序。

因此,我建议:

1 - 要么改变你的模型逻辑,通过创建虚拟字段来满足你的要求,要么改变数据库架构来包含这些数据。

2 - 如果数据需要进一步或实时处理,并且无法在数据库中添加或计算,也许编写一个组件来复制 cakephp 集合上的分页功能将是一个不错的选择。这种方法的缺点是所有记录都将从数据库中返回,这可能会在大型结果集上出现性能问题。

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 2016-11-19
    • 2011-08-26
    • 2015-03-24
    • 2018-01-25
    • 2011-02-04
    • 2012-09-25
    • 2015-05-30
    • 2013-06-08
    相关资源
    最近更新 更多