任何人都可以解释CDbCriteria->范围的工作原理吗?

时间:2011-06-29 17:15:11

标签: yii cdb

我刚刚查看了CDbCriteria的手册页,但没有足够的信息。 此属性自v1.1.7起可用,我找不到任何帮助。 是动态改变Model->scopes“动态”吗?

2 个答案:

答案 0 :(得分:13)

默认情况下,范围是创建简单过滤器的简便方法。使用范围,您可以自动按特定列对结果进行排序,限制结果,应用条件等。在@ldg提供的链接中,有一个很好的例子:

$posts=Post::model()->published()->recently()->findAll();

有人正在一行中检索所有最近发布的帖子。它们比内联条件(例如Post::model()->findAll('status=1'))更容易维护,并且封装在每个模型中,这意味着更高的透明度和易用性。

另外,您可以创建自己的基于参数的范围,如下所示:

public function last($amount)
{
    $this->getDbCriteria()->mergeWith(array(
        'order' => 't.create_time DESC',
        'limit' => $amount,
    ));
    return $this;
}

将类似内容添加到模型中将允许您选择要从数据库中检索的对象数量(按创建时间排序)。 通过返回对象本身,您可以进行方法链接。

以下是一个例子:

$last3posts=Post::model()->last(3)->findAll();

获取最后3项。当然,您可以将示例扩展到数据库中的几乎任何属性。干杯

答案 1 :(得分:4)

是的,范围可用于使用预先构建的条件更改CDbCriteria的属性,也可以传递参数。在1.1.7之前,您可以在model()查询中使用它们,并且可以链接在一起。看到: http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes

从1.1.7开始,您还可以将范围用作CDbCriteria属性。 请参阅:http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-with-named-scopes