1

状況: CausalType 1 -> N Causal

causaltype の管理ビューでは、cgridview を使用しています。各 causalType の因果数を表示する必要があります。

CausalType への関係を設定します

return array(
                        "causals" => array (self::HAS_MANY, "Causal", "causalTypeId"  ), 
                );

クラス変数を追加しました

  public $activeCausalCount; 

これは管理ビューの列です

 array (
                  'name' => 'activeCausalCount',
                  'value' => 'count($data->causals)',    
            ), 

実際、これは search() の私の基準です

    $criteria=new CDbCriteria;

$criteria->compare('id',$this->id,true);
$criteria->compare('name',$this->name,true);
$criteria->compare('isActive',$this->isActive);

各タイプの因果関係の数は正しいのですが、問題があります

1) アクティブな因果関係のみをカウントする必要があります (causals.isActive = 1 の因果関係をカウントします)

2) 列をソートする必要があります

3)(整数で)フィルタリングする必要があります

4

2 に答える 2

2

COUNT での並べ替えとフィルター処理が本当に必要な場合、それは少し大きなプロセスになる可能性があります。

一つの方法は...

CausalType テーブルに列を追加します (それを呼び出しますactiveCausals) 。

CausalTypeモデルでリレーションを定義する

"totalActiveCasuals" => array(
      self::STAT, 
      "Causal", 
      "causalTypeId", 
      'condition'=>'totalActiveCasuals.isActive=1'
), 

afterSaveCausal でメソッドを定義する

protected function afterSave() 
{
    $this->causaltype->activeCausals = $this->causaltype->totalActiveCasuals;
    $this->causaltype->save();

    return parent::afterSave();
}

これで、新しい列でactiveCausals非常に簡単にフィルター処理、並べ替えができるようになりました。

于 2012-10-15T14:20:01.200 に答える
0

次のように、タイプ STAT の CasualType に新しいリレーションを追加します。

return array(
   "casuals" => array (self::HAS_MANY, "Causal", "causalTypeId"  ), 
   "totalCasuals" => array (self::STAT, "Causal", "causalTypeId"  ), 
   "totalActiveCasuals" => array (self::STAT, "Causal", "causalTypeId", 'condition' => 'active = true'    ), 
);

次に、ビューでそれを通常の属性/関係として使用します

于 2012-10-15T13:52:08.060 に答える