2013-04-22 17 views
1

我有defaultScope代碼:DefaultScope()和Beforefind()之間的區別?

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(); 
} 

我在兩者的功能得到同樣的結果。哪個功能更好,爲什麼?

回答

2

我認爲兩者都可以實現你想要的,但對我來說最好的用法是使用範圍。在YII引導我們可以發現下面的定義爲範圍:

的命名範圍表示可與其它命名範圍進行組合 並施加到一個有效記錄的查詢命名查詢條件。

這是你想要做的:在執行查詢之前應用一些查詢條件。而且,由於您希望在每個查詢中添加這些條件,那麼defaultScope就是要走的路!

0

我不同意。我有一個包含多個用戶記錄的數據庫,我試圖過濾那些只對當前用戶可見的記錄。今天我被卡住了,試圖用defaultScope來解決這個問題,我發現beforeFind就是這種情況。這個問題可以歸結爲beforeFind似乎不用於關係,而defaultScope是。這意味着當你在一個對象的defaultScope中應用標準時,由於在連接中應用了標準的順序,所以這些對象中的關係是熱切地加載了相似的標準。

讓我嘗試Yii's blog guide來解釋這一點:當我們只希望當前作者的文章中,我們可以編寫以下defaultScope

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

當使用$post->author,我們會發現,author.author_id應用作者被定義爲聯接之前。這不是最好的例子,但是當你的關係中有兩個以上的連接時,你會發現自己有這些問題。

因此,我建議使用beforeFind而不是defaultScope