我有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();
}
我在两个函数中得到相同的结果。哪个功能更好,为什么?
答案 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}}。