• Yii framwork crud 命名范围NAMED SCOPE 笔记四


    命名范围 
    Note: 对命名范围的支持从版本 1.0.5 开始。 命名范围的最初想法来源于 Ruby on Rails.
    命名范围(named scope) 表示一个 命名的(named)查询规则,它可以和其他命名范围联合使用并应用于 Active Record 查询
    命名范围主要是在 CActiveRecord::scopes() 方法中以名字-规则对的方式声明。如下代码在 Post 模型类中声明了两个命名范围,
    published 和 recently。
    class Post extends CActiveRecord
    {
        ......
        public function scopes()
        {
            return array(
                'published'=>array(
                    'condition'=>'status=1',
                ),
                'recently'=>array(
                    'order'=>'create_time DESC',
                    'limit'=>5,
                ),
            );
        }
    }
    具体使用:  $posts=Post::model()->published()->recently()->findAll();
    注意: 命名范围只能用于类级别方法。也就是说,此方法必须使用 ClassName::model() 调用。


    参数化的命名范围
    命名范围可以参数化。例如, 我们想自定义 recently 命名范围中指定的帖子数量,要实现此目的,不是在CActiveRecord::scopes
    方法中声明命名范围, 而是需要定义一个名字和此命名范围的名字相同的方法:
    public function recently($limit=5)
    {
        $this->getDbCriteria()->mergeWith(array(
            'order'=>'create_time DESC',
            'limit'=>$limit,
        ));
        return $this;
    }
    然后,我们就可以使用如下语句获取3条最近发布的帖子。
    $posts=Post::model()->published()->recently(3)->findAll();//上面的代码中,默认获取 5 条最近发布的帖子。


    默认范围
    模型类可以有一个默认范围,它将应用于所有 (包括相关的那些) 关于此模型的查询。例如,一个支持多种语言的网站可能只想显
    示当前用户所指定的语言的内容。 因为可能会有很多关于此网站内容的查询, 我们可以定义一个默认范围以解决此问题。 为实
    现此目的,我们覆盖 CActiveRecord::defaultScope 方法如下:
    class Content extends CActiveRecord
    {
        public function defaultScope()
        {
            return array(
                'condition'=>"language='".Yii::app()->language."'",
            );
        }
    }

    现在,如果下面的方法被调用,将会自动使用上面定义的查询规则:$contents=Content::model()->findAll();


    实际应用
    上面的是几个官方给出的例子,下面是我自己使用的例子供大家参考一下:


    TABLE:
    school:id(pk,int),name(varchar)  //学校
    class:id(pk,int),name(varchar),s_id(fk,int)  //班级
    student:id(pk,int),name(varchar),s_id(int),c_id(int)  //学生


    例子:查询为学校为“a"的,所有班级,这时我们可以先在School模型中的relations方法中定义一个关系方便调用
    public function relations()  
    {  
        return array(  
            'class'=>array(self::HAS_MANY, 'Class', 's_id'),  
        );  
    }
    public function scopes()
    {
        return array(
            'getAllClass'=>array(
                'with'=>'class',
            ),
        };
    }
    public function getAllClass($name)
    {
        $this->getDbCriteria()->mergeWith(array(
            'condition'=>"t.name=$name",
        ));
        return $this;

    }

    使用:School::model()->getAllClass("a")->findAll();

  • 相关阅读:
    20145313《信息安全系统设计基础》第0周学习总结
    20145313张雪纯课程总结
    RocEDU.阅读.写作《苏菲的世界》书摘(七)
    RocEDU.阅读.写作《苏菲的世界》书摘(六)
    20145310《信息安全系统设计基础》课程总结
    20145310 《信息安全系统设计基础》第五周同学问题总结
    20145310《信息安全系统设计基础》第十四周学习总结
    20145310《信息安全系统设计基础》第十三周学习总结
    20145310《信息安全系统设计基础》实验五 网络通信
    20145310《信息安全系统设计基础》实验四 外设驱动程序设计
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3002604.html
Copyright © 2020-2023  润新知