PHP

PHP ORM 框架

Posted by liuxu379 on July 12, 2021

ORM 框架简介

对象-关系映射(Object-Relational Mapping,简称ORM),一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。具有减少重复性代码、提高开发效率、方便移植等优点。

Eloquent

Laravel 的 Eloquent ORM 提供了一个漂亮、简洁的 Active Record 实现来和数据库交互。

return Destination::orderByDesc(
    Flight::select('arrived_at')
        ->whereColumn('destination_id', 'destinations.id')
        ->orderBy('arrived_at', 'desc')
        ->latest()
        ->limit(1)
)->get();

通过 Composer 进行安装,改造原有 App_Db 类。拥有 Active Record 特性,使用简单易维护。但需要 PHP >= 7.2 才能接入。

Think-Orm

  • 支持Mysql/Pgsql/Sqlite/SqlServer/Oracle/Mongodb
  • 基于PDO实现
  • 支持原生查询和查询构造器
  • 支持事务
  • 支持模型和关联
// 进行CURD操作
Db::table('user')
	->data(['name'=>'thinkphp','email'=>'thinkphp@qq.com'])
	->insert();	

Db::table('user')
	->where('id','>',10)
	->order('id','desc')
	->limit(10)
	->select();

Db::table('user')
	->where('id',10)
	->update(['name'=>'test']);	

Db::table('user')
	->where('id',10)
	->delete();

通过 Composer 进行安装,改造原有 App_Db 类。使用方法与 ThinkPHP 相似,使用简单易维护。

Doctrine

Doctrine 支持支持全文检索,接近原生SQL。

$query = $em->createQuery("SELECT u FROM User u JOIN u.address a WHERE a.city = 'Berlin'");
$users = $query->getResult();

通过 Composer 进行安装,改造原有 App_Db 类。更偏向原生SQL,简单易维护。

Propel

Propel 通过XML格式的模式定义文件和相应的配置文件来生成SQL和类,它允许你使用对象代替SQL来读写数据库表中的记录。

$books = BookQuery::create()
  ->where('Book.Title = ?', 'War And Peace')
  ->where('Book.PublishedAt > ?', $date)
  ->find();

$books = BookQuery::create()
  ->where('Book.Title = ?', 'War And Peace')
  ->_or()
  ->where('Book.Title LIKE ?', 'War%')
  ->find();

通过 Composer 进行安装,需要将所有表写入XML配置文件,不易改造。

Eloquent 使用技巧

配置多库

模式一

创建 DB 类,定义多个数据库方法

<?php
use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;

class DB
{
        static public function Connection($host, $database, $username, $password, $charset, $collation = 'utf8_unicode_ci', $prefix = '')
    {
        $capsule = new Capsule;
        $capsule->addConnection([
            'driver' => 'mysql',
            'host' => $host,
            'database' => $database,
            'username' => $username,
            'password' => $password,
            'charset' => $charset,
            'collation' => $collation,
            'prefix' => $prefix,
        ]);

        $capsule->setEventDispatcher(new Dispatcher(new Container));
        $capsule->setAsGlobal();
        $capsule->bootEloquent();
        return $capsule->getConnection();
    }


    static public function Master()
    {
        return self::Connection(
        "driver" => "mysql",
        "host" => '',
        "database" => '',
        "username" => '',
        "password" => '',
        'charset' => '',
        'collation' => '',
        'prefix' => '',
        );
    }

    static public function Salve()
    {
        return self::Connection(
        "driver" => "mysql",
        "host" => '',
        "database" => '',
        "username" => '',
        "password" => '',
        'charset' => '',
        'collation' => '',
        'prefix' => '',
        );
    }

}

使用

DB::mysqlMaster()->table('')->where()->get();

模式二

use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;

$master = [
    "driver" => "mysql",
    "host" => '',
    "database" => '',
    "username" => '',
    "password" => '',
    'charset' => '',
    'collation' => '',
    'prefix' => '',
];

$salve = [
    "driver" => "mysql",
    "host" => '',
    "database" => '',
    "username" => '',
    "password" => '',
    'charset' => '',
    'collation' => '',
    'prefix' => '',
];

$capsule = new Capsule;
$capsule->addConnection($master);
$capsule->addConnection($salve);

$capsule->setEventDispatcher(new Dispatcher(new Container));
$capsule->setAsGlobal();
$capsule->bootEloquent();
return $capsule->getConnection();