yii数据库查询自学笔记--命名空间

命名空间其实就是设置查询条件,当然也可以用作update,delete的条件了。

要使用命名空间,就在AR类中覆盖方法 scopes 。 

废话少说,示例如下:

在Tag类中覆盖scopes : 

	//命名范围测试 , 命名范围这个函数scopes 应该定义在AR类里面
	public function scopes(){
		return array(
			'newTag'=>array(
				'condition'=>'name=:name',
				'params'=>array(
					':name'=>'newTag',
				),
			),
			'recently'=>array(
				'order'=>'id DESC',
				'limit'=>4,
			),	
		);
	}
然后在一个控制器中测试一下:  这样就能查询到scopes中过滤得到的数据了。 

public function actionScopes(){
		//命名范围 scopes 测试 
		$tags = Tag::model()->newTag()->recently()->findAll();
		foreach($tags as $tag){
			echo $tag->id."  ";
			echo $tag->name."   ";
			echo $tag->frequency."<br>";
		}
Comment中的scopes方法 : 

//命名空间,设置查询条件 
	public function scopes(){
		return array(
			'approved'=>array(
				'condition'=>'t.status='.self::STATUS_APPROVED,
			),
			'recently'=>array(
				'order'=>'t.create_time DESC',   // 这里最好指明是主表吧,否则可能会出错
				'limit'=>5,
			),
		);
	}
Post类中的scopse方法: 

	//命名空间的使用。其实就是设置查询条件 
	public function scopes(){
		return array(
			'published'=>array(
				'condition'=>'status='.self::STATUS_PUBLISHED,
			),
			'recently'=>array(
				'order'=>'update_time DESC',
				'limit'=>3,
			),
		);
	}
控制器测试方法:

public function actionScopes(){		
		echo "<hr>关联查询和命名空间搭配使用<br>";
		$posts = Post::model()->recently()->published()->with('comments')->findAll();
		foreach($posts as $post){
			echo $post->id."  |";
			foreach($post->comments as $comment){
				echo $comment->id.": ";
				echo $comment->content."<br>";
			}
			echo $post->author->username."<br>";
		}
		echo "<hr>关联查询和命名空间搭配使用<br>";
		
		$posts = Post::model()->with("comments:recently:approved")->findAll();
		foreach($posts as $post){
			echo $post->id."  |";
			foreach($post->comments as $comment){
				echo $comment->id.": ";
				echo $comment->content."<br>";
			}
			echo $post->author->username."<br>";
		}
		echo "<hr>";
		
	}
命名空间可以和关联查询联合使用,上面就是这样的例子。 






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章