`

PHP简单的ORM实现(postgresql)

阅读更多

 

用户表简单操作,简单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();

 

执行结果:

删除成功

 

 

分享到:
评论

相关推荐

    php中的orm

    Phalcon ORM则是Phalcon PHP框架的一部分,它以C扩展的形式实现,提供了出色的性能。Phalcon ORM同样提供了一种直观的方式来定义模型、关系以及执行数据库操作。 在这些ORM框架中,"源码"标签可能意味着博客会深入...

    Postgresql-DB的访问PHP类

    从压缩包子文件的文件名称列表来看,只有一个名为"Postgresql-DB的访问PHP类"的文件,这可能是一个PHP源代码文件,包含了实现上述功能的类定义。这个文件可能包含了以下部分: 1. 类定义:定义一个PHP类,例如`...

    Doctrine ORM for PHP

    ORM 技术可以将对象模型转换为关系数据库模型,从而实现数据的持久化存储。 什么是 Doctrine? Doctrine 是一种基于 PHP 语言的 ORM 工具,旨在解决 PHP 应用程序中数据库操作的问题。Doctrine 提供了一种简洁、...

    postgresql

    PostgreSQL,通常简称为"pg",是一种开源的对象关系型数据库管理系统(ORM DBMS),以其强大的功能、稳定性、可扩展性和安全性而广受赞誉。它支持标准SQL,并且拥有一系列高级特性,如事务处理、多版本并发控制...

    postgresql Windows64位

    - 驱动支持:PostgreSQL支持多种编程语言的驱动,如Python的psycopg2,Java的JDBC,PHP的PDO等,方便与其他应用集成。 - ORM框架:如Hibernate和Entity Framework,简化了与数据库的交互。 7. **备份与恢复** - ...

    postgresql-9.2.1-1-windows

    PostgreSQL,简称“pg”,是一个高度发达的开源对象关系型数据库管理系统(ORM DBMS),它以其强大的功能、稳定性以及对数据完整性和正确性的严格保障而备受赞誉。自1986年开始研发以来,PostgreSQL已经积累了超过15...

    Laravel开发-laravel-postgresql-inherit

    尽管Eloquent默认并不直接支持PostgreSQL的表继承,但我们可以利用自定义模型和查询构建器来实现这一功能。 1. 创建模型:在Laravel中,每个数据表通常对应一个Eloquent模型。为了支持继承,你需要为父表和每个子表...

    Laravel开发-eloquent-postgresql

    Eloquent是Laravel的核心对象关系映射(ORM),它为开发者提供了简洁、优雅的PHP实现来处理数据库操作。而Pogount是Laravel的一个扩展,专门为Eloquent增加了对PostgreSQL数据库的支持。 首先,我们需要理解Laravel...

    doctrine-orm

    它遵循ORM(对象关系映射)的模式,是PHP中使用广泛的ORM工具之一。ORM的目的是将数据库操作转化为面向对象的形式,以便开发人员可以使用面向对象的方式来处理数据库,提高开发效率和代码可维护性。 Doctrine2作为...

    PHP Framework ThinkPHP-为API开发而设计的高性能PHP框架

    ThinkPHP 集成了 think-orm3.0 版本,这是一个强大的对象关系映射(ORM)库,允许开发者通过简单的 PHP 代码操作数据库,支持多种数据库系统如 MySQL、PostgreSQL 等。ORM 提供了模型、查询构造器、事务处理等功能...

    Laravel开发-laravel-postgresql-fulltext

    在本文中,我们将深入探讨如何在Laravel框架中利用PostgreSQL数据库进行全文搜索以及实现继承表的支持。Laravel是一款流行的PHP框架,它以其优雅的语法和丰富的生态系统深受开发者喜爱。而PostgreSQL则是一款功能...

    PHP 库通过返回原始 SQL 来实现 ActiveRecord

    由于某些情况下可能无法使用PDO,比如旧版本的PHP环境或特定服务器配置,这个库提供了一种替代方案,实现了类似的功能,特别是移植了yii2框架的ORM功能。Yii2是一个流行的PHP框架,其ORM组件是基于ActiveRecord模式...

    AnalogueORM一个灵活易于使用的数据映射器ORMforPHP

    **Analogue ORM** 是一个专为PHP设计的轻量级数据映射器对象关系映射(ORM)框架,它的核心目标是提供一个简单且灵活的方式来处理数据库操作。ORM的主要作用是将传统的关系型数据库表结构与面向对象的编程模型进行...

    Laravel开发-laravel-postgres

    此外,PostgreSQL还支持保存点,允许在事务内部进行部分回滚,但Laravel原生并不直接支持,需要自定义实现。 10. **触发器与存储过程**: 虽然Laravel不直接支持触发器和存储过程的创建,但你仍然可以在数据库层面...

    PHP实例开发源码—以厘php框架.zip

    【PHP实例开发源码—以厘php框架.zip】是一个包含PHP开发源代码的压缩包,主要聚焦于以厘PHP框架的实现。这个框架可能是为了简化Web应用开发,提高开发效率和代码可维护性而设计的。PHP是一种广泛使用的服务器端脚本...

    PostgreSQL:PostgreSQL参考

    PostgreSQL,简称Postgres,是一款开源的对象关系型数据库管理系统(ORM DBMS),以其强大的功能、稳定性、丰富的数据类型以及对ACID(原子性、一致性、隔离性、持久性)事务的支持而广受赞誉。它允许开发人员在...

    php票务管理系统源码

    3. 数据库管理:系统通常使用MySQL或PostgreSQL等关系型数据库存储票务信息、用户数据、订单详情等。ORM(对象关系映射)工具如Eloquent(Laravel的一部分)用于简化数据库操作。 4. 前端技术:HTML、CSS和...

    基于PHP的DolphinPHP(海豚PHP)快速开发框架.zip

    7. **数据库支持**:兼容多种数据库,如MySQL、SQLite、PostgreSQL等,提供ORM(对象关系映射)工具,简化数据库操作。 8. **安全防护**:内置了防止SQL注入、XSS攻击等安全措施,保障应用安全。 **二、DolphinPHP...

    传智php面试宝典

    数据库管理是PHP开发的重要环节,宝典会讲解如何使用PHP连接和操作MySQL、PostgreSQL等数据库,包括SQL查询、事务处理、存储过程等。同时,也会涉及到ORM(对象关系映射)技术,如PDO和Doctrine,使得数据库操作更加...

Global site tag (gtag.js) - Google Analytics