連想クエリ、Yii はいわゆる統計クエリ (または集計クエリ) もサポートしています。 これは、各投稿のコメント数、各製品の平均評価など、関連するオブジェクトに関する集計情報を取得することを指します。 統計クエリは、HAS_MANY (たとえば、投稿に多数のコメントがある) または MANY_MANY (たとえば、投稿が多数のカテゴリに属し、カテゴリに多数の投稿がある) に関連付けられたオブジェクトに対してのみ実行されます。
統計クエリの実行は、前述の相関クエリと非常に似ています。まず、CActiveRecord の relationship() メソッドで統計クエリを宣言する必要があります。
[html]
クラス Post は CActiveRecord を拡張します
{
パブリック関数の関係()
{
return array(
'commentCount'=>array(self::STAT, 'Comment', 'post_id'),
'categoryCount'=>array(self::STAT, 'Category', 'post_category(post_id,category_id)'),
);
}
}
クラス Post は CActiveRecord を拡張します
{
パブリック関数関係()
{
return array(
'commentCount'=>array(self::STAT, 'Comment', 'post_id'),
'categoryCount'=>array(self::STAT, 'Category', 'post_category(post_id,category_id)'),
);
}
}関連付けられたクエリ名前空間
関連するクエリは名前空間を使用して実行することもできます。 2つの形式があります。最初の形式では、名前空間がメイン モデルに適用されます。 2 番目の形式では、名前空間がリレーショナル モデルに適用されます。
以下のコードは、メイン モデルに名前空間を適用する方法を示しています。
$posts=Post::model()->published()->recently()->with('comments')->findAll();
これは、非連想クエリに非常に似ています。唯一の違いは、名前空間の後に with() 呼び出しを使用することです。 このクエリは、最近公開された投稿とそのコメントを返す必要があります。
以下のコードは、名前空間を関連モデルに適用する方法を示しています。
$posts=Post::model()->with('comments:recently:approved')->findAll();
上記のクエリは、すべての投稿とそのモデレートされたコメントを返します。コメントは関連付け名を参照するのに対し、最近と承認済みは Comment モデル クラスで宣言された名前空間を参照することに注意してください。アソシエーション名と名前空間はコロンで区切る必要があります。
名前空間は、CActiveRecord::relations() で宣言された関連付けルールの with オプションでも指定できます。以下の例では、$user->posts にアクセスすると、この投稿のモデレートされたすべてのコメントが返されます。
[html]
クラス ユーザーは CActiveRecord を拡張します
{
パブリック関数の関係()
{
return array(
'posts'=>array(self::HAS_MANY, 'Post', 'author_id', 'with'=>'comments:approved'),
);
}
}
クラス ユーザーは CActiveRecord を拡張します
{
パブリック関数関係()
{
return array(
'posts'=>array(self::HAS_MANY, 'Post', 'author_id', 'with'=>'comments:approved'),
);
}
}