我有一个Invoice
模型hasMany
收费。每次我收到发票时,都会返回所有相关费用(Charge
是belongsTo
Invoice
的模型。我想要的是还要退还每张发票的SUM
费用。
我尝试使用以下虚拟字段,但它返回了所有费用的SUM(不是发票)。
//In Charge model
public $virtualFields = array(
'total_charges' => 'SUM(Charge.amount)'
);
我的虚拟字段是否不正确(我认为某处需要GROUP BY
)?我的模型中有更好的选择吗?
我正在使用CakePHP 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计算收费?