1

私はdefaultScopeのコードを持っています:

public function defaultScope()
{
    $currentdb  = explode('=', Yii::app()->db->connectionString);

    return array(
         'condition'=> "tenant=:tenant",
         'params' => array(":tenant"=>$currentdb[2]));
}

そして、Beforefind のこのコード:

public function beforeFind() {
    $currentdb  = explode('=', Yii::app()->db->connectionString);
    $criteria = new CDbCriteria;
    $criteria->condition = "tenant=:tenant";
    $criteria->params = array(":tenant"=>$currentdb[2]);

    $this->dbCriteria->mergeWith($criteria);
    parent::beforeFind();
}

私は両方の機能で同じ結果を得ています。どちらの機能が優れているか、またその理由は?

4

2 に答える 2

2

どちらも目的を達成できると思いますが、私にとって最適な使い方はスコープを使用することです。yii ガイドでは、スコープについて次の定義を見つけることができます。

名前付きスコープは、他の名前付きスコープと組み合わせてアクティブなレコード クエリに適用できる名前付きクエリ条件を表します。

それはあなたがしたいことです:クエリを実行する前にいくつかのクエリ基準を適用します。そして、これらの基準をすべてのクエリに追加したいので、それdefaultScopeが道です!

于 2013-04-22T13:14:40.247 に答える
0

同意しません。複数のユーザーのレコードを含むデータベースがあり、現在のユーザーのみに表示されるレコードをフィルター処理しようとしています。今日、それを修正しようとして行き詰まりましたが、この場合はそれが正しい方法defaultScopeであることがわかりましたbeforeFind。問題はbeforeFind、関係で使用されていないように見えるという事実に突き止めることができますdefaultScopedefaultScopeこれは、基準が結合に適用される順序のために、同様の基準が熱心にロードされているリレーションを持つオブジェクトに基準を適用すると、スタックすることを意味します。

これをYii のブログ ガイドで説明してみましょう。現在の著者の投稿のみが必要な場合は、次のように記述できますdefaultScope

$c = new CDbCriteria();
$c->with('author');
$c->addInCondition('author.author_id', array(1,2,3));
return $c;

を使用すると、 author が結合として定義される前に が適用さ$post->authorれていることがわかります。author.author_idこれは最良の例ではありませんが、リレーションに 3 つ以上のジョインがある場合、これらの問題が発生することに気付くでしょう。

したがって、beforeFind代わりに を使用することをお勧めしdefaultScopeます。

于 2014-02-03T15:10:56.530 に答える