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

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

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)

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

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

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles