Home Backend Development PHP Tutorial Common PHP ORM framework and simple code implementation

Common PHP ORM framework and simple code implementation

Nov 26, 2016 pm 02:25 PM
orm framework php

Object Relational Mapping (ORM) is a technology designed to solve the mismatch between object-oriented and relational databases. Simply put, ORM automatically persists objects in a program into a relational database by using metadata that describes the mapping between objects and databases. Essentially converting data from one form to another.

ORM provides the generation of all SQL statements, and coders are away from database concepts. Mapping from a conceptual requirement (such as a HQL) to a SQL statement costs nothing, not even 1% performance loss. The real performance hit is during the mapping process, and more specifically, during object instantiation.

At present, the more famous PHP open source ORMs include the following:

1. Propel

Propel is an ORM mapping (Object Relational Mapping) framework suitable for PHP5. It provides object persistence layer support based on Apache Torque. It generates SQL and classes through schema definition files in XML format and corresponding configuration files. It allows you to use objects instead of SQL to read and write records in database tables. Propel provides a generator to create SQL definition files and PHP classes for your data model. Developers can also easily customize the generated classes. We can also integrate Propel into existing application development frameworks through XML, PHP classes and Phing build tools. For example, versions before 1.2 of the PHP framework symfony are used by default. A streamlined version of Propel serves as the default ORM framework.

Official website: http://www.propelorm.org/

2. Doctrine

Doctrine is a PHP ORM framework, it must run on >=php5.2.3 version, it is a powerful data abstraction layer.

One of its main features is that it uses an object-oriented approach to implement database query closure. Its bottom layer uses a DQL query statement similar to Hibernate HQL to perform database queries, which makes development more flexible and greatly reduces the time required. Duplicate code. Compared with Propel, the advantage of Doctrine is that it supports full-text search. Doctrine's documentation has always been more comprehensive and richer than Propel, the community is more active, and it is more natural, easier to read, and closer to native SQL. Performance is also slightly better than Propel. Similarly, you can easily integrate Doctrine into existing application frameworks. For example, the 1.3 and later versions of the PHP framework symfony use Doctrine as the default ORM framework, and you can also integrate Doctrine with Codeigniter.

Official website: http://www.doctrine-project.org/

3. EZPDO

EZPDO is a very lightweight PHP ORM framework. The original intention of the author of EZPDO is to reduce the complex ORM learning curve and strike a balance between ORM operating efficiency and functionality as much as possible. It is the simplest ORM framework I have ever used so far, and I still want to integrate it. Come to my CoolPHP SDK, and the running efficiency is quite good, and the functions can basically meet the needs, but the update of EZPDO is relatively slow.

Official website: http://www.ezpdo.net/

4. RedBean

RedBean is an easy-to-use, lightweight PHP ORM framework that provides support for MySQL, SQLite & PostgreSQL. The RedBean architecture is very flexible and the core is very simple. Developers can easily extend functions through plug-ins.

Official website: http://www.redbeanphp.com/

5. Others

The domestic fleaphp development framework implements ORM implementation based on TableDataGateway; Zend Framework, in addition to providing encapsulation of SQL statements, also implements TableGateway, Implementation of TableRowSet and TableRow; there are also some solutions similar to Rails' ActiveRecord implementation.

In general, the general ORM framework can meet the basic needs of simple application systems, which can greatly reduce the difficulty of development and improve development efficiency. However, it is definitely worse than the pure SQL language in terms of SQL optimization. The processing of complex relationships and SQL embedded expressions may not be ideal. Perhaps this is mainly due to the problem of object persistence in PHP itself, which results in ORM being too inefficient and generally slower than pure SQL. But there are ways to solve these. The most basic solution to solve performance, we can improve efficiency through caching. For Hibernate, although the configuration is complicated, it greatly alleviates the problem through the flexible use of second-level cache and query cache. The query pressure of the database greatly improves the performance of the system.

If you want to implement a PHP ORM yourself, you can refer to the following:

<?php
abstract class Model{
   protected $pk = &#39;id&#39;;
   protected $_ID = null; 
   protected $_tableName;
   protected $_arRelationMap;
   protected $_modifyMap;
   protected $is_load = false;
   protected $_blForDeletion;
   protected $_DB;
   public function __consturct($id = null){
       $this->_DB = mysql_connect(&#39;127.0.0.1&#39;,&#39;root&#39;,&#39;&#39;) ;
       $this->_tableName = $this->getTableName();
       $this->_arRelationMap = $this->getRelationMap();
       if(isset($id))$this->_ID = $id;
   }
   abstract protected function getTableName();
   abstract protected function getRelationMap();
   public function Load(){
       if(isset($this->_ID)){
           $sql = "SELECT ";
           foreach($this->_arRelationMap as $k => $v){
               $sql .= &#39;`&#39;.$k.&#39;`,&#39;;
           }
           $sql .= substr($sql,0,strlen($sql)-1);
           $sql .= "FROM ".$this->_tableName." WHERE ".$this->pk." = ".$this->_ID;
           $result =$this->_DB->mysql_query($sql);
           foreach($result[0] as $k1 => $v1){
              $member = $this->_arRelationMap[$key];
              if(property_exists($this,$member)){
                 if(is_numeric($member)){
                     eval(&#39;$this->&#39;.$member.&#39; = &#39;.$value.&#39;;&#39;);
                 }else{
                     eval(&#39;$this->&#39;.$member.&#39; = "&#39;.$value.&#39;";&#39;);
                 }
              }
           }
       }
       $this->is_load = true;
   }
   public function __call($method,$param){
      $type   = substr($method,0,3);
      $member = substr($method,3);
      switch($type){
         case &#39;get&#39;:
             return $this->getMember($member);
             break;
         case &#39;set&#39;:
             return $this->setMember($member,$param[0]);
      }
      return false;
   }
   public function setMember($key){
       if(property_exists($this,$key)){
          if(is_numeric($val)){
             eval(&#39;$this->&#39;.$key.&#39; = &#39;.$val.&#39;;&#39;);
          }else{
             eval(&#39;$this->&#39;.$key.&#39; = "&#39;.$val.&#39;";&#39;);
          }
          $this->_modifyMap[$key] = 1;
       }else{
          return false;
       }
   }
   
   public function getMember($key,$val){
       if(!$this->is_load){
          $this->Load();
       }
       if(property_exists($this,$key)){
          eval(&#39;$res = $this->&#39;.$key.&#39;;&#39; );
          return $this->$key;
       }
       return false;
   }
   public function save(){
      if(isset($this->_ID)){
          $sql = "UPDATE ".$this->_tableName." SET ";
          foreach($this->arRelationMap as $k2 => $v2){
              if(array_key_exists( $k2, $this->_modifyMap)){
                  eval( &#39;$val = $this->&#39;.$v2.&#39;;&#39;);
                  $sql_update .=  $v2." = ".$val;
              }
          }
          $sql .= substr($sql_update,0,strlen($sql_update));
          $sql .= &#39;WHERE &#39;.$this->pk.&#39; = &#39;.$this->_ID;
      }else{
          $sql = "INSERT INTO ".$this->_tableName." (";
          foreach($this->arRelationMap as $k3 => $v3){
              if(array_key_exists( $k3,$this->_modifyMap)){
                  eval(&#39;$val = $this->&#39;.$v3.&#39;;&#39;);
                  $field  .= "`".$v3."`,"; 
                  $values .= $val;
              }
          }
          $fields = substr($field,0,strlen($field)-1);
          $vals   = substr($values,0,strlen($values)-1);
          $sql .= $fields." ) VALUES (".$vals.")";
      }
      echo $sql;
      //$this->_DB->query($sql);
   }
   public function __destory(){
      if(isset($this->ID)){
         $sql = "DELETE FROM ".$this->_tableName." WHERE ".$this->pk." = ".$this->_ID;
        // $this->_DB_query($sql);
      }
   }
}
class User extends Model{
    protected  function getTableName(){
       return "test_user";
    }
    protected function getRelationMap(){
        return array( 
                      &#39;id&#39;       => USER_ID,
                      &#39;user_name&#39;=> USER_NAME,
                      &#39;user_age&#39; => USER_AGE
                    );
    }
    public function getDB(){
       return $this->_DB;
    }
}
$UserIns = new User();
print_r($UserIns);
?>
Copy after login


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

CakePHP Project Configuration CakePHP Project Configuration Sep 10, 2024 pm 05:25 PM

In this chapter, we will understand the Environment Variables, General Configuration, Database Configuration and Email Configuration in CakePHP.

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

CakePHP Date and Time CakePHP Date and Time Sep 10, 2024 pm 05:27 PM

To work with date and time in cakephp4, we are going to make use of the available FrozenTime class.

CakePHP File upload CakePHP File upload Sep 10, 2024 pm 05:27 PM

To work on file upload we are going to use the form helper. Here, is an example for file upload.

CakePHP Routing CakePHP Routing Sep 10, 2024 pm 05:25 PM

In this chapter, we are going to learn the following topics related to routing ?

Discuss CakePHP Discuss CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP is an open-source framework for PHP. It is intended to make developing, deploying and maintaining applications much easier. CakePHP is based on a MVC-like architecture that is both powerful and easy to grasp. Models, Views, and Controllers gu

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

CakePHP Creating Validators CakePHP Creating Validators Sep 10, 2024 pm 05:26 PM

Validator can be created by adding the following two lines in the controller.

See all articles