yii2.0數據庫交互ORM

ORM Object  Relational  Mapping  對象關係映射

ObjectPHP 對象,屬性

Relational 數據庫表,字段

Mapping 對象和表的關係;屬性與字段的關係 

自制ORM框架

在models文件夾下創建AOrm基類 AOrm.php

<?php
namespace  app\models;
abstract class AOrm{
    public $tablename;
    public $primaryKey='id';
    public $id;

    public abstract function Mapping();
    /*
     *  將對象持久化到數據庫
     *  如果id屬性沒有被賦值,那麼執行插入操作,否則執行更新操作
     */
    public  function  save(){


                 $sql=$this->buildSaveSql();
                 \yii::$app->db->createCommand($sql)->execute();
    }

    private function buildSaveSql(){
        $sql='';
        $mapping=$this->Mapping();
        $fields=[];
        $values=[];
        if(empty($this->id)){
            /*
                * 沒有id執行插入操作
                * INSERT INTO table_name() values()
            */
            foreach($mapping as $k=>$v){
                if(isset($this->$k)){
                /*
                 * mapping中的$k有uName,       pwd,        nName,      restMoney,
                 * mapping中的$v有username,    password,   nickname,   rest
                 * 所以$this->$k指向的是
                 *                      public $uName
                 *                      public $pwd
                 *                      public $nName
                 *                      public $restMoney
                 * isset($this->$k)表示這些變量是否有值;
                 * $this->$k需要在控制器中賦值,如: AomController下
                 *          $object=new BUser()
                 *          $object->nName='AORM';
                 */
                    array_push($fields,$v);
                    array_push($values,"'{$this->$k}'");

                }
            }
                 return $sql='INSERT INTO '.$this->tablename.'('.implode(',',$fields).') VALUES('.implode(',',$values).')';
        }else{
            $set=[];
                //更新操作 UPDATE table_name SET  field=value , field=value where id=
            foreach($mapping as $k=>$v){
                if(isset($this->$k)){
                    array_push($set, "{$v}='{$this->$k}'");
                 }
             }
            return $sql='UPDATE '.$this->tablename.' SET '.implode(',',$set).' WHERE '.$this->primaryKey.'='.$this->id;
        }

    }
        public function del(){
            if(!empty($this->id)){
                \yii::$app->db->createCommand('DELETE FROM '.$this->tablename.' where '.$this->primaryKey.'='.$this->id)->execute();
            }else{
                return false;
            }
         }


}
創建子類文件models/BUser.php

<?php
 
namespace  app\models;
class BUser extends AOrm{
    public $tablename='test';
    public $id;
    public $uName;
    public $pwd;
    public $nName;
    public $restMoney;

    public function Mapping()
    {
        // TODO: Implement Mapping() method.
        return [
            'uName'     =>'username',
            'pwd'       =>'password',
            'nName'     =>'nickname',
            'restMoney' =>'rest'
        ];
    }

}
在控制器中調用models/AOrm下的方法

<?php
 
namespace  app\controllers;
use app\models\BUser;
use yii\web\Controller;

class AomController extends Controller{

    public function actionTest(){
         $object= new BUser() ;
         $object->uName='ORM';
         $object->pwd='123456';
         $object->nName='哈哈';
         $object->id=4;
         $res=$object->del();
         echo "<pre>";
            print_r($res);
    }
}

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