1

充電するInvoiceモデルがあります。hasMany請求書を受け取るたびに、関連するすべての料金が返されます(これChargeはモデルですbelongsTo Invoice)。私が欲しいのは、SUM請求書ごとのすべての料金の返還もすることです。

次の仮想フィールドを使用しようとしましたが、すべての料金の合計が返されました(請求書ではありません)。

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

GROUP BY仮想フィールドが正しくありませんか(どこかに必要だと思います)?私のモデルにはもっと良いオプションがありますか?

CakePHP2.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はいくつかの制限があります。virtualFieldsまず、条件、順序、またはフィールド配列の関連モデルでは使用できません。これを行うと、フィールドが ORM に置き換えられないため、通常は SQL エラーが発生します。これは、関連付けられたモデルが見つかる深さを推定するのが難しいためです。

この実装の問題の一般的な回避策は、 virtualFieldsモデルにアクセスする必要がある場合に、実行時にあるモデルから別のモデルにコピーすることです::

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

また::

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

代わりに、SQL ではなく php で料金を集計できますか?

于 2012-07-07T23:47:21.163 に答える