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); } }