【问题标题】:CakePHP 2.0 pagination and sum on hasMany-associated modelCakePHP 2.0 对 hasMany 关联模型的分页和求和
【发布时间】:2012-03-04 13:40:48
【问题描述】:
Project hasMany Comments
Payment (id, project_id, value, date)

我想在我的索引视图中包含一个等于每个项目的付款总和的列。我希望能够按此字段排序。

我在这里发现了一些类似的问题,但它们都与分页无关。

我当前(错误)的解决方案:

    $this->paginate = array('Project' => array(
            'conditions' => array('Project.archived =' => $archive),
            'order' => 'Project.start_date DESC',
            'contain' => array(
                    'Payment' => array(
                            'fields' => array('SUM(Payment.value) as Project__value_sum'),
                            'group'  => array('Payment.project_id'),
                            )
                        )
        ));
    $data = $this->paginate('Project');
    $this->set('projects', $data);
    $this->set('archive', $archive);

【问题讨论】:

    标签: cakephp


    【解决方案1】:

    看来您可能想要在 Payment 模型上创建一个 afterSave

    在 afterSave 函数中,您运行一些 MySQL 来汇总相关项目的付款(使用 MySQL SUM()),并将其存储在 Project.payment_total 中。

    然后,您可以轻松地按该字段排序,这样您就不必在每个页面上运行复杂的 MySQL,因为它只会在必要时运行(即当有新的或更改的付款时)

    【讨论】:

    • 我之前已经注意到了,但是,我想保留一笔付款,而不是一笔付款。
    • @milosz - 在意识到我错过了你的问题后,我编辑了我的答案。
    • 谢谢,这似乎有效。然而,我觉得可笑的是,CakePHP 不允许使用聚合函数和分组依据的简单方法来执行简单的查询。
    • 我很确定您也可以按照您尝试的方式进行操作(不是您想要的,但是...),只是不确定如何随意。也许使用加入而不是包含?我认为 Contain 使用多个查询,所以 - 去 JOIN 路线应该允许你做你正在尝试的事情。 (但只是猜测那部分)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多