Defaultscope()和Beforefind()之间的区别?

时间:2013-04-22 12:22:43

标签: php yii

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

我在两个函数中得到相同的结果。哪个功能更好,为什么?

2 个答案:

答案 0 :(得分:2)

我认为两者都可以达到你想要的效果,但对我来说最好的用法是使用范围。在yii指南中,我们可以找到以下范围定义:

  

命名范围表示可以组合的命名查询条件   与其他命名范围一起应用于活动记录查询。

这是您想要做的:在执行查询之前应用一些查询条件。由于您希望在每个查询中添加这些条件,因此defaultScope是最佳选择!

答案 1 :(得分:0)

我不同意。我有一个包含多个用户记录的数据库,我正在尝试过滤那些只对当前用户可见的记录。今天我试图用defaultScope解决这个问题时遇到困难,我发现beforeFind是这种情况下的方法。问题可以归结为beforeFind似乎没有在关系defaultScope上使用defaultScope。这意味着当您在对象的defaultScope中应用标准时,如果由于条件在连接中的应用顺序而急切地加载了相似的条件,则会陷入困境。

让我尝试用Yii's blog guide解释一下:当我们只想要当前作者的帖子时,我们可以写下以下$c = new CDbCriteria(); $c->with('author'); $c->addInCondition('author.author_id', array(1,2,3)); return $c;

$post->author

使用author.author_id时,我们会发现在将作者定义为联接之前应用了beforeFind。这不是最好的例子,但是当你的关系中有两个以上的连接时,你会发现自己遇到了这些问题。

因此,我建议您使用defaultScope代替{{1}}。