2011-06-29 6 views
4

私はちょうどCDbCriteriaのマニュアルページをチェックしましたが、十分な情報がありません。 このプロパティはv1.1.7以降で利用可能で、ヘルプが見つかりませんでした。 「オンザフライ」で動的にModel->scopesを変更するのですか?誰もCDbCriteria-> scopeがどのように機能するか説明できますか?

+0

私たちの答えの手がかりはありませんか? – Korcholis

+0

例を探している人のために、私は[ブログ投稿](http://blog.4aal.nl/post/yii-named-scopes-examples)を作成しました。 – Henk

答えて

13

スコープはデフォルトで簡単なフィルタを簡単に作成する方法です。スコープを使用すると、彼らはどのようにクールの大きな例があります@ldgから提供されているリンクではなど、自動的に特定の列で、あなたの結果をソート結果を制限、条件を適用することができます。

$posts=Post::model()->published()->recently()->findAll(); 

誰かがすべて取得されます最近公開された投稿を1行にまとめました。インライン条件(例:Post::model()->findAll('status=1'))よりも保守が容易で、各モデルの内部にカプセル化されているため、透過性が高く、使いやすさが向上します。

プラス、あなたはこのようなあなた自身のパラメータベースのスコープを作成することができます:モデルの中にこのような何かを追加する

public function last($amount) 
{ 
    $this->getDbCriteria()->mergeWith(array(
     'order' => 't.create_time DESC', 
     'limit' => $amount, 
    )); 
    return $this; 
} 

はあなたがデータベースから取得するオブジェクトの量を選択できるようになる(並べ替え、その時間を作る)。 オブジェクト自体を返すことで、メソッド連鎖が可能になります。

はここに例を示します

$last3posts=Post::model()->last(3)->findAll(); 

は、最後の3つの項目を取得します。もちろん、この例をデータベースのほぼすべてのプロパティに拡張することができます。乾杯

+0

しかし、CActiveRecordスコープではなく、スコープでCDbCriteriaを使用する方法を尋ねました。 paramsでそれらを使用する方法について説明します。 – RusAlex

+0

CActiveRecordスコープは実際にはCDbCriteriaの変更の影響を受け、CDbCriteriaスコープは実際にCActiveRecordレコードをフィルタリングします。 CDbCriteriaは、データベース結果の条件をカプセル化する方法です。だから私は何の違いも見つけられない。あなたが心配して大きなコードブロックを見ると、last()関数はパラメータを持つカスタムスコープです。 – Korcholis

4

はい、スコープを使用して、事前構築された条件付きのCDbCriteriaの属性を変更したり、パラメータを渡すこともできます。 1.1.7より前には、それらをmodel()クエリで使用して、一緒にチェーンすることができました。参照: http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes

1.1.7以降、スコープをCDbCriteriaプロパティとして使用することもできます。 参照:http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-with-named-scopes

+0

あなたは私の使用例を教えてくれますか?私は自分で試してみましたが、モデルスコープのパラメータを条件スコープのプロパティで「オンザフライ」で変更する方法はありません。 – RusAlex

関連する問題