2

私は、Person多くの種類の を受け取ることができるを持っていますIncome。稼いSUMだ収入をIncome Type

+---------------+-----------------+
| INCOME TYPE   | SUM AMOUNT      |
+---------------+-----------------+
| Salary        | $934.33         |
| Gambling      |  $27.99         |
| Tips          | $584.00         |
+---------------+-----------------+        

self::STAT受け取った全体的な収入 ($1546.32) を提供するリレーショナル クエリを取得できましたが、 Income Type.

その結果、次のように、モデルself::HAS_MANY内でリレーショナル クエリとして実行しようとしています。Person

  public function relations() {
     return array(
        'incomes_total' => array(
           self::HAS_MANY,
           'Income',
           'person_id',
           'select' => array('income_type_id', 'SUM(amount) AS total'),
           'group' => "income_type_id"
     ));
  }

これにより、次の SQL が生成されます。

SELECT
  "incomes_total"."income_type_id" AS "t1_c5"
, SUM(amount) AS total
, "incomes_total"."id" AS "t1_c0"
FROM "stwd_income" "incomes_total"
WHERE ("incomes_total"."person_id"=:ypl0)
GROUP BY income_type_id

これは、必要なクエリに非常に近くなります。

私が理解できないのは, "incomes_total"."id" AS "t1_c0"、そこに行が追加された理由です。私はそれをしたくありません。エラーが発生していCDbExceptionます:

CDbCommand failed to execute the SQL statement: 
SQLSTATE[42803]: Grouping error: 7 ERROR: column "incomes_total.id" must 
appear in the GROUP BY clause or be used in an aggregate function.

必要なタイプのクエリを実現するにはどうすればよいですか?

更新 1: Active Record とカスタム SQL クエリの違いが明らかになり始めており、Active Record はそのようなタスクには適していない可能性があります。

4

1 に答える 1

1

個人的には、非常に基本的なクエリと CRUD 以外には ActiveRecord を使用しません。STAT 関係が存在する場合でも、それらは単純なカウントまたは合計に使用する方が適切です。そして、モデルの配列を期待していないので、HAS_MANY 関係は何らかの形で間違っていますよね? IDと合計の単純な配列のみが必要なため、この場合、 Person モデルに次のようなメソッドを作成するだけです

private $_salaryInfo;

public function getSalaryInfo()
{
    //cache the value if possible to save unnecessary queries
    if(isset($this->_salaryInfo))
        return $this->_salaryInfo;

    //query database
    $command = Yii::app()->db->createCommand();
    $command->select('income_type_id, SUM(amount)')->where('person_id = '.$this->id)->groupBy('income_type_id');
    return $this->_salaryInfo = $command->queryAll();
}

あなたは今できるはずです

foreach($person->salaryInfo as $type_id => $sum)
于 2013-02-11T15:15:13.573 に答える