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();