4

我刚刚检查了 的手册页CDbCriteria,但没有足够的信息。这个属性从 v1.1.7 开始可用,我找不到任何帮助。是否用于动态更改Model->scopes“即时”?

4

2 回答 2

14

默认情况下,范围是创建简单过滤器的一种简单方法。使用范围,您可以自动按特定列对结果进行排序、限制结果、应用条件等。在@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 个项目。当然,您可以将示例扩展到数据库中的几乎任何属性。干杯

于 2011-06-30T14:01:44.337 回答
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

于 2011-06-29T18:38:59.103 回答