设为首页 收藏本站
查看: 888|回复: 0

[经验分享] PHP简单的ORM实现(postgresql)

[复制链接]

尚未签到

发表于 2016-11-20 10:00:22 | 显示全部楼层 |阅读模式
  用户表简单操作,简单orm实现原理:
  postgresql:system_user表如下:
  /*
  Navicat Premium Data Transfer
  Source Server         : 本地
  Source Server Type    : PostgreSQL
  Source Server Version : 90404
  Source Host           : 127.0.0.1
  Source Database       : dbname
  Source Schema         : public
  Target Server Type    : PostgreSQL
  Target Server Version : 90404
  File Encoding         : utf-8
  Date: 08/21/2015 16:33:36 PM
  */
  -- ----------------------------
  --  Table structure for system_user
  -- ----------------------------
  DROP TABLE IF EXISTS "public"."system_user";
  CREATE TABLE "public"."system_user" (
  "id" int4 NOT NULL DEFAULT nextval('system_user_id_seq'::regclass),
  "first_name" varchar(64) COLLATE "default",
  "last_name" varchar(128) COLLATE "default",
  "username" varchar(32) COLLATE "default",
  "md5_pw" varchar(32) COLLATE "default",
  "email_address" varchar(128) COLLATE "default",
  "date_last_login" date,
  "date_account_created" date,
  "time_last_login" time(6),
  "time_account_created" time(6)
  )
  WITH (OIDS=FALSE);
  ALTER TABLE "public"."system_user" OWNER TO "username";
  -- ----------------------------
  --  Records of system_user
  -- ----------------------------
  BEGIN;
  INSERT INTO "public"."system_user" VALUES ('9', 'Tim', 'Nowicki', '', null, '', '2015-08-21', '2015-08-21', '16:01:42', '16:01:46');
  INSERT INTO "public"."system_user" VALUES ('11', 'Tim', 'Nowicki', '', null, '', '2015-08-21', '2015-08-21', '16:04:11', '16:04:13');
  INSERT INTO "public"."system_user" VALUES ('12', 'Tim', 'Nowicki', '', null, '', '2015-08-21', '2015-08-21', '16:05:15', '16:06:02');
  INSERT INTO "public"."system_user" VALUES ('13', 'Tim', 'LinLIIII', null, null, null, '2015-08-21', '2015-08-21', null, null);
  INSERT INTO "public"."system_user" VALUES ('14', 'Lin', 'Nowicki', null, null, null, null, '2015-08-21', null, null);
  INSERT INTO "public"."system_user" VALUES ('15', 'Lin', 'Nowicki', null, null, null, null, '2015-08-21', null, null);
  COMMIT;
  -- ----------------------------
  --  Primary key structure for table system_user
  -- ----------------------------
  ALTER TABLE "public"."system_user" ADD PRIMARY KEY ("id") NOT DEFERRABLE INITIALLY IMMEDIATE;
  1,简单的orm实现
  用户类(User2.php)
  <?php
  /* 
  * To change this license header, choose License Headers in Project Properties.
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
  class User{
  private $ID;
  private $objPDO;
  private $strTableName;
  private $arRelationMap;
  private $blForDeletion;
  private $FirstName;
  private $LastName;
  private $Username;
  private $Password;
  private $EmailAddress;
  private $DateLastLogin;
  private $TimeLastLogin;
  private $DateAccountCreated;
  private $TimeAccountCreated;
  public function __construct(PDO $objPDO,$id = NULL) {
  $this->strTableName = "system_user";
  $this->arRelationMap = [
  "id"                    => "ID",
  "first_name"            => "FirstName",
  "last_name"             => "LastName",
  "username"              => "Username",
  "md5_pw"                => "password",
  "email_address"         => "EmailAddress",
  "date_last_login"       => "DateLastLogin",
  "time_last_login"       => "TimeLastLogin",
  "date_account_created"  => "DateAccountCreated",
  "time_account_created"  => "TimeAccountCreated"
  ];
  $this->objPDO = $objPDO;
  if(isset($id)){
  $this->ID = $id;
  $strQuery = "SELECT ";
  foreach ($this->arRelationMap as $key => $value) {
  $strQuery .= "\"".$key."\",";
  }
  $strQuery = substr($strQuery, 0, strlen($strQuery)-1);
  $strQuery .=" FROM ".$this->strTableName." WHERE \"id\" = :eid";
  $objStatement = $this->objPDO->prepare($strQuery);
  $objStatement->bindParam(':eid', $this->ID, PDO::PARAM_INT);
  $objStatement->execute();
  $arRow = $objStatement->fetch(PDO::FETCH_ASSOC);
  foreach ($arRow as $key => $value) {
  $strMember = $this->arRelationMap[$key];
  if(property_exists($this, $strMember)){
  if(is_numeric($value)){
  eval('$this->'.$strMember .' = '.$value.';');
  }else{
  eval('$this->'.$strMember.' = "'.$value.'";');
  }
  }
  }
  }
  }
  public function Save(){
  if(isset($this->ID)){
  $strQuery = 'UPDATE "'.$this->strTableName.'" SET ';
  foreach ($this->arRelationMap as $key => $value) {
  eval('$actualVal = &$this->'.$value.';');
  if(isset($actualVal)){
  $strQuery .= '"' .$key. "\" = :$value,";
  }
  }
  $strQuery = substr($strQuery, 0,strlen($strQuery)-1);
  $strQuery .=' WHERE "id"=:eid';
  unset($objStatement);
  $objStatement = $this->objPDO->prepare($strQuery);
  $objStatement->bindValue(':eid', $this->ID,  PDO::PARAM_INT);
  foreach ($this->arRelationMap as $key => $value) {
  eval('$actualVal = &$this->'.$value.';');
  if(isset($actualVal)) {
  if(is_int($actualVal)){
  $objStatement->bindValue(':'.$value, $this->$value, PDO::PARAM_INT);
  }elseif($actualVal == NULL){
  //postgresql:if some column type is null,update will cause error,u need insert null,not ''
  $objStatement->bindValue(':'.$value, NULL, PDO::PARAM_STR);
  }else{
  $objStatement->bindValue(':'.$value, $this->$value, PDO::PARAM_STR);
  }
  }
  }
  $objStatement->execute();
  echo '更新成功';exit;
  }else{
  $strValueList = "";
  $strQuery = 'INSERT INTO "'.$this->strTableName.'" (';
  foreach ($this->arRelationMap as $key => $value) {
  eval('$actualVal = &$this->'.$value.';');
  if(isset($actualVal)){
  $strQuery .= '"' .$key. '",';
  $strValueList .= ":$value,";
  }
  }
  $strQuery = substr($strQuery, 0, strlen($strQuery)-1);
  $strValueList = substr($strValueList, 0, strlen($strValueList)-1);
  $strQuery .= ") VALUES (";
  $strQuery .= $strValueList;
  $strQuery .= ")";
  unset($objStatement);
  $objStatement = $this->objPDO->prepare($strQuery);
  foreach ($this->arRelationMap as $key => $value) {
  eval('$actualVal = &$this->'.$value.';');
  if(isset($actualVal)){
  if(is_int($actualVal) || $actualVal == NULL){
  $objStatement->bindValue(':'.$value, $actualVal, PDO::PARAM_INT);
  }else{
  $objStatement->bindValue(':'.$value, $actualVal, PDO::PARAM_STR);
  }
  }
  }
  $objStatement->execute();
  $this->ID = $this->objPDO->lastInsertId($this->strTableName."_id_seq");
  }
  }
  public function MarkFordeletion(){
  $this->blForDeletion = true;
  }
  public function __destruct() {
  if(isset($this->ID)){
  if($this->blForDeletion == true){
  $strQuery = 'DELETE FROM "'.$this->strTableName.'" WHERE "id" =:eid';
  $objStatement = $this->objPDO->prepare($strQuery);
  $objStatement->bindValue(':eid', $this->ID,  PDO::PARAM_INT);
  $objStatement->execute();
  echo '删除成功';exit;
  }
  }
  }
  public function __call($strFunction, $arArguments) {
  $strMethodType = substr($strFunction, 0,3);
  $strMethodMember = substr($strFunction, 3);
  switch ($strMethodType) {
  case 'set':
  return ($this->SetAccessor($strMethodMember, $arArguments[0]));
  break;
  case 'get':
  return ($this->GetAccessor($strMethodMember));
  }
  return (false);
  }
  private function SetAccessor($strMember,$strNewValue){
  if(property_exists($this, $strMember)){
  if(is_numeric($strNewValue)){
  eval('$this->'.$strMember.' = '.$strNewValue.';');
  }else{
  eval('$this->'.$strMember.' = "'.$strNewValue.'";');
  }
  }else{
  return (false);
  }
  }
  private function GetAccessor($strMember){
  if(property_exists($this, $strMember)){
  eval('$strRetVal = $this->'.$strMember.';');
  return ($strRetVal);
  }else{
  return (false);
  }
  }
  }
  2,postgresql连接(PdoFactory.php):
  <?php
  /* 
  * To change this license header, choose License Headers in Project Properties.
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
  class PdoFactory extends PDO{
  public static function getPDO($osn,$username, $passwd, $options){
  try { 
  $pdo = new PDO($osn,$username, $passwd, $options); 
  $pdo->setAttribute(PDO::ATTR_PERSISTENT, true);  // 设置数据库连接为持久连接  
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  // 设置抛出错误  
  } catch (PDOException $e) { 
  exit('数据库连接失败,错误信息:'. $e->getMessage()); 
  } 
  return $pdo;
  }
  }
  测试:
  1插入用户数据:
  <?php
  /* 
  * To change this license header, choose License Headers in Project Properties.
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
  require_once 'PdoFactory.php';
  require_once 'User2.php';
  //$dsn = 'mysql:host=127.0.0.1;dbname=tesst;port=3306';
  //host=127.0.0.1 port=5432 dbname=dbname user=username password=123456
  $dsn ="pgsql:dbname=dbname;host=127.0.0.1;port=5432";
  $objPdo = PdoFactory::getPDO($dsn,'username','123456',[]);
  $objUser = new User($objPdo);
  //print_r($objUser);
  $objUser->setFirstName('Lin');
  $objUser->setLastName('Nowicki');
  $objUser->setDateAccountCreated(date('Y-m-d'));
  echo $objUser->getFirstName();
  echo '<br />';
  echo $objUser->getLastName();
  echo '<br />';
  print 'Saving...<br/>';
  $objUser->Save();
  print "ID in dateBase is ". $objUser->getID()."<br />";
  执行结果:
  Lin
Nowicki
Saving...
ID in dateBase is 16
  2,更新用户数据:
  require_once 'PdoFactory.php';
  require_once 'User2.php';
  //$dsn = 'mysql:host=127.0.0.1;dbname=tesst;port=3306';
  //host=127.0.0.1 port=5432 dbname=dbname user=username password=123456
  $dsn ="pgsql:dbname=dbname;host=127.0.0.1;port=5432";
  $objPdo = PdoFactory::getPDO($dsn,'username','123456',[]);
  $objUser = new User($objPdo,16);
  $objUser->setFirstName("Tim");
  $objUser->setLastName("LinLIIII");
  $objUser->Save();
  产生结果:
  更新成功
  3,删除用户数据
  require_once 'PdoFactory.php';
  require_once 'User2.php';
  //$dsn = 'mysql:host=127.0.0.1;dbname=tesst;port=3306';
  //host=127.0.0.1 port=5432 dbname=dbname user=username password=123456
  $dsn ="pgsql:dbname=dbname;host=127.0.0.1;port=5432";
  $objPdo = PdoFactory::getPDO($dsn,'username','123456',[]);
  $objUser = new User($objPdo,16);
  $objUser->MarkFordeletion();
  执行结果:
  删除成功

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-302781-1-1.html 上篇帖子: Postgresql :创建新实例过程详解 下篇帖子: JIRA连接PostgreSQL数据库的详细步骤
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表