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似乎没有用于关系的事实defaultScope。这意味着当您在defaultScope对象中应用条件时,您会遇到困难,因为在连接中应用条件的顺序会急切地加载类似条件的关系。

让我试着用Yii 的博客指南来解释一下:当我们只想要当前作者的帖子时,我们可以这样写defaultScope

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

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

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

于 2014-02-03T15:10:56.530 回答