1

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

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

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

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

我正在使用 CakePHP 2.2。

4

2 回答 2

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;
}
于 2012-07-09T02:33:16.160 回答
0

这直接取自 CakePHP 书:

虚拟字段的限制

的实现virtualFields有一些限制。首先,您不能virtualFields在关联模型上使用条件、顺序或字段数组。这样做通常会导致 SQL 错误,因为字段不会被 ORM 替换。这是因为很难估计可以找到相关模型的深度。

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

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

或者::

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

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

于 2012-07-07T23:47:21.163 回答