带有GROUP BY的关联模型的CakePHP SUM

时间:2012-07-07 19:11:33

标签: cakephp model cakephp-2.2

我有一个Invoice模型hasMany收费。每次我收到发票时,都会返回所有相关费用(ChargebelongsTo Invoice的模型。我想要的是还要退还每张发票的SUM费用。

我尝试使用以下虚拟字段,但它返回了所有费用的SUM(不是发票)。

//In Charge model
public $virtualFields = array(
    'total_charges' => 'SUM(Charge.amount)'
);

我的虚拟字段是否不正确(我认为某处需要GROUP BY)?我的模型中有更好的选择吗?

我正在使用CakePHP 2.2。

2 个答案:

答案 0 :(得分:1)

我在afterFind模型中使用Invoice回调找到了答案。这是我正在使用的功能:

public function afterFind($results) {
    foreach ($results as $key => $val) {
        if (isset($val['Charge'])) {
            $total = 0;
            foreach ($val['Charge'] as $charge) {
                $total += $charge['amount'];
            }
            $results[$key]['Invoice']['total_charges'] = $total;
        }
    }
    return $results;
}

答案 1 :(得分:0)

这是直接从CakePHP书中获取的:

  

virtualFields的限制

     

virtualFields的实施有一些限制。第一   您无法在相关模型上使用virtualFields条件,   顺序或字段数组。这样做通常会导致SQL   错误,因为字段未被ORM替换。这是因为它   很难估计相关模型的深度   找到。

     

此实施问题的常见解决方法是复制   在需要时,virtualFields在运行时从一个模型到另一个模型   访问它们::

<?php
$this->virtualFields['full_name'] = $this->Author->virtualFields['full_name'];
     

或::

<?php
$this->virtualFields += $this->Author->virtualFields;

相反,也许你可以用PHP而不是通过sql计算收费?