資料庫之AR

程式碼修行者發表於2015-02-09

資料庫之AR

Active Record (AR) 是一個流行的 物件-關係對映 (ORM) 技術。 每個 AR 類代表一個資料表(或檢視),資料表(或檢視)的列在 AR 類中體現為類的屬性,一個 AR 例項則表示表中的一行。
– yiichina

gii

這裡簡單提一下gii 具體百度一下,你就知道
是YII的程式碼生成工具
下面使用的User類就是gii生成的

CRUD

   C

public function actionCreate()
{
    //$user = new User; //例項化userModel
    //或
    //$user = User::model();
    //$user->setIsNewRecord(true);

    //給對應的欄位賦值
    $user->username = "框架";
    $user->status = 0;
    $user->city = 5;

    //插入資料
    //這裡值得細說的是 IsNewRecord變數為true
    //場景(scenario)為insert 
    //具體看 實現原理
    if($user->save())
    {
        echo '插入成功';
    }else
    {
        var_dump($user->errors);
    }
}

   C實現原理

例項化 User model

$user = new User;

User extends CActiveRecord 呼叫 CActiveRecord的構造方法

public function __construct($scenario='insert')
{
    //使用 靜態方法 model例項化物件 場景(scenario)為空
    if($scenario===null) // internally used by populateRecord() and model()
        return;

    $this->setScenario($scenario); //設定場景為 insert
    $this->setIsNewRecord(true); //設定 這個一條新紀錄

    //獲得欄位的預設值
    $this->_attributes=$this->getMetaData()->attributeDefaults; 

    $this->init(); //一個空方法 子類可以自己重寫

    $this->attachBehaviors($this->behaviors()); //繫結行為
    $this->afterConstruct(); //觸發 構造結束事件
}

   R

public function actionRead()
{
    $user = User::model()->find();
    //這裡的場景(Scenario)仍然是update哦
    $user = User::model()->find('id = :id',array(':id'=>5));
    var_dump($user);
}

public function actionReadAll()
{
    $user = User::model()->findAll();

    $user = User::model()->findAll('id > :lid and id < :mid',array(':lid'=>5,':mid'=>10));
    var_dump($user);
}

public function actionReadCriteria()
{
    $criteria = new CDbCriteria();
//        $criteria->addCondition('id > :lid');
//        $criteria->addCondition('id < :mid');
//        $criteria->addBetweenCondition('id', 5, 10); //包含 5 和 10
//        $criteria->addInCondition('id',array(4,5,6)); 
//        $criteria->params = array(':lid'=>5,':mid'=>10);
    $criteria->addSearchCondition('username', 'g%' ,false);
    $criteria->addSearchCondition('username', 'g');
    $criteria->order = 'id desc';
//        $criteria->limit = 2;
//        $criteria->offset = 1;
    $user = User::model()->findAll($criteria);

    var_dump($user);
}

   R實現原理

find()和findall()

//建立一個 條件物件  CDbCriteria類
$criteria=$this->getCommandBuilder()
                ->createCriteria($condition,$params);
//查詢
return $this->query($criteria,true);

   U

public function actionUpdate()
{
    $id = Yii::app()->request->getParam('id');
    $user = User::model()->findByPk($id);
    $user->username = "被我改了吧";

    //這裡值得細說的是 IsNewRecord變數為false
    //場景(scenario)為update
    //具體看 實現原理
    if($user->save())
    {
        echo '修改成功';
    }else
    {
        var_dump($user->errors);
    }
}

   U實現原理

$user = User::model()->findByPk($id);

呼叫的User的 靜態方法model

public static function model($className=__CLASS__)
{
    return parent::model($className);
}

呼叫父類 CActiveRecord 類的 model方法

public static function model($className=__CLASS__)
{
    if(isset(self::$_models[$className]))
        return self::$_models[$className];
    else
    {
                          //例項化類
        $model=self::$_models[$className]=new $className(null);
                          //繫結行為
        $model->attachBehaviors($model->behaviors());
        return $model;
    }
}

   D

public function actionDelete()
{
    $id = Yii::app()->request->getParam('id');
    $user = User::model()->findByPk($id);
    if($user->delete())
    {
        echo '刪除成功';
    }  else {
        var_dump($user->errors);
    }
}

   D實現原理

沒有什麼特別的

if(!$this->getIsNewRecord())
{
    Yii::trace(get_class($this).'.delete()','system.db.ar.CActiveRecord');
    if($this->beforeDelete())
    {
        $result=$this->deleteByPk($this->getPrimaryKey())>0;
        $this->afterDelete();
        return $result;
    }
    else
        return false;
}

場景和新紀錄

場景(scenario)
新紀錄(IsNewRecord)

1.場景的作用更多體現在 insert 和 update上,這也是預設的場景只有insert和update

new User() 場景被賦值成insert
User::model()query()的時候 呼叫 populateRecords()賦值成update

節選自yiichina網友的一片博文,比較好的描述了yii中場景的作用
場景的作用

2.新紀錄一般用來區別insert和其他操作

相關文章