名前付き範囲
注: 名前付き範囲のサポートはバージョン 1.0.5 から始まります。 名前付きスコープの元のアイデアは、Ruby on Rails から生まれました。
名前付きスコープは名前付きクエリ ルールを表し、他の名前付きスコープと組み合わせて使用したり、アクティブ レコード クエリに適用したりできます
名前付きスコープは、主に CActiveRecord::scopes() メソッドの名前とルールのペアの形式で宣言されます。次のコードは、Post モデル クラスで 2 つの名前付きスコープを宣言します
最近出版されたもの。
クラス Post extends CActiveRecord
{
…
パブリック関数のスコープ()
{
return array(
'公開'=>array(
'条件'=>'ステータス=1',
)、
'最近'=>array(
'order'=>'create_time DESC',
'制限'=>5,
)、
);
}
}
具体的な使用法: $posts=Post::model()->published()->recently()->findAll();
注: 名前付きスコープはクラスレベルのメソッドでのみ使用できます。つまり、このメソッドは ClassName::model() を使用して呼び出す必要があります。
パラメータ化された名前付き範囲
名前付き範囲はパラメータ化できます。たとえば、これを達成するには、CActiveRecord::scopes ではなく、最近名前を付けたスコープで指定された投稿の数をカスタマイズしたいと考えています
メソッド内で名前付き範囲を宣言する代わりに、名前付き範囲と同じ名前のメソッドを定義する必要があります:
最近の公開関数($limit=5)
{
$this->getDbCriteria()->mergeWith(array(
)
'order'=>'create_time DESC',
'limit'=>$limit,
));
$this を返します;
}
次に、次のステートメントを使用して、最新の 3 つの投稿を取得します。
$posts=Post::model()->published()->recently(3)->findAll();//上記のコードでは、デフォルトで最近公開された 5 つの投稿が取得されます。
デフォルトの範囲
モデル クラスには、このモデルに関するすべてのクエリ (関連するクエリを含む) に適用されるデフォルトのスコープを持つことができます。たとえば、複数の言語をサポートする Web サイトでは、
のみを表示したい場合があります。
現在のユーザーが指定した言語でコンテンツを表示します。 この Web サイトのコンテンツに関するクエリは多数ある可能性があるため、この問題を解決するためにデフォルトのスコープを定義できます。 本当です
この目的のために、次のように CActiveRecord::defaultScope メソッドをオーバーライドします。
class Content は CActiveRecord を拡張します
{
パブリック関数defaultScope()
{
return array(
'condition'=>" language='".Yii::app()-> language."'",
);
}
}
実用的なアプリケーション
上記はいくつかの公式の例です。参考のために私自身が使用した例を以下に示します。
テーブル:
class:id(pk,int),name(varchar),s_id(fk,int) //クラス
Student:id(pk,int),name(varchar),s_id(int),c_id(int) //学生
例: クエリは学校「a」のすべてのクラスを対象としています。この時点では、簡単に呼び出すために、最初に School モデルの relationship メソッドで関係を定義できます。
パブリック関数の関係()
{
配列を返します(
'class'=>array(self::HAS_MANY, 'Class', 's_id'),
);
}
パブリック関数のスコープ()
{
配列を返します(
'getAllClass'=>array(
'with'=>'クラス',
)、
};
}
パブリック関数 getAllClass($name)
{
$this->getDbCriteria()->mergeWith(array(
)
'条件'=>"t.name=$name",
));
$this を返します;
使用: School::model()->getAllClass("a")->findAll();