【问题标题】:How do I sort a bit complex paginated array with SUM, COUNT and GROUP BY in CakePHP?如何在 CakePHP 中使用 SUM、COUNT 和 GROUP BY 对有点复杂的分页数组进行排序?
【发布时间】:2013-11-05 03:33:44
【问题描述】:

我的分页设置如下:

        $this->Paginator->settings = array(
            'limit' => 100,
            'order' => 'Traffic.accessed DESC',
            'conditions' => array(
                'Traffic.webmaster_site_id' => $this->WebmasterSite->find('list', array(
                    'fields' => 'WebmasterSite.id',
                    'conditions' => array(
                        'WebmasterSite.user_id' => $this->Auth->user('id')
                    )
                ))
            ),
            'fields' => 'DATE(Traffic.accessed) AS `access_date`,
                        SUM(Traffic.webmaster_site_transfer) as total_webmaster_income,
                        COUNT(Traffic.webmaster_site_id) as total_webmaster_clicks',
            'group' => 'DATE(Traffic.accessed)',
            'paramType' => 'querystring'
        );

        $click_data = $this->Paginator->paginate('Traffic');

        $this->set('click_data', $click_data);

在视野中

<th class="text-center">
    <?php if ($this->Paginator->sortKey() == 'Traffic.total_webmaster_clicks') {
        if ($this->Paginator->sortDir() == 'asc') {
            $sort_icon = '<i class="icon-sort-up"></i> ';
        } else {
            $sort_icon = '<i class="icon-sort-down"></i> ';
        }
    } else {
        $sort_icon = '<i class="icon-sort"></i> ';
    } ?>
    <?php echo $this->Paginator->sort('Traffic.total_webmaster_clicks',$sort_icon.__('Total Clicks'),array('escape'=>false)); ?>
</th>

所以Traffic.total_webmaster_clicks 没有排序。请注意,这来自分页语句中的AS total_webmaster_clicks

我不明白如何对此类(选定的)字段和 GROUP BY 进行排序。另外,我无法创建 virtualFields,因为 DATETIME 字段有一个 GROUP BY。

谢谢。

【问题讨论】:

  • 您始终可以创建虚拟字段 - 这是您应该和需要在这里做的事情。分组方式仍然有效!
  • 问题是我在使用virtualFields时得到subquery contains more than one rows,因为流量表有很多webmaster_site_id。
  • 这不是虚拟字段的问题,而是查询本身的问题。设计失败,因此无论有无虚拟字段,它都无法工作。 afaik COUNT() 无法按照您希望的方式在这里工作。
  • 如果无法更改您的查询,您将不得不重写模型的 paginate 和可能的 paginatecount 函数才能处理 total_webmaster_clicks。 book.cakephp.org/2.0/en/core-libraries/components/…

标签: php sorting cakephp pagination


【解决方案1】:

对于复杂的查询默认排序是不行的,所以你应该创建一个视图并使用与模型相同的视图,你肯定会得到分页排序。通过使用视图,您的应用程序性能也会提高

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2015-10-30
    • 2018-01-14
    • 1970-01-01
    相关资源
    最近更新 更多