程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Yii framwork crud 命名范圍NAMED SCOPE

Yii framwork crud 命名范圍NAMED SCOPE

編輯:關於PHP編程

命名范圍
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();

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved