深入研究 Laravel ORM (Laravel Eloquent) 系统 (一) – 概要

本文作为 Laravel ORM 系统的研究开篇,主要对 Laravel ORM 系统的主要功能、依赖的第三方类库、系统的目录结构及对应目录所实现的功能,进行解释说明。 学习完本篇教程,你将会对 Laravel ORM 的结构有个全局观念,并且为后续研究打好基础。

一、Laravel ORM 概要

Illuminate database(Laravel ORM) 组件 在 GitHub 的地址

1.1 Laravel ORM 简介

Illuminate database 提供内置查询语句构造器,Eloquent ORM,表空间(schema)构造器实现 PHP 对数据库操作的 ORM 系统。当前支持 MySQL, Postgres, SQL Server 和 SQLite 四款数据库。此外还提供在 Laravel 框架内使用的数据库抽象层 DB 类。

非但如此,database 组件提供了能在非 Laravel 框架以外的项目使用接口 Capsule 类。

使用方法也很简单:

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;

$capsule->addConnection([
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => 'password',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
]);

// Set the event dispatcher used by Eloquent models... (optional)
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();

// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
$capsule->bootEloquent();

1.2 Laravel ORM 的依赖组件

通过项目 composer.json 配置文件我们可以看到,本项目依赖的其它组件有:

1.3 Laravel ORM 下载安装

git clone git@github.com:illuminate/database.git

composer install

1.4 Laravel ORM 目录结构

|---- vendor
  |---- composer             composer 包管理生成的自动加载文件
  |---- doctrine             单复数转换器组件
  |---- illuminate           Laravel ORM 系统
    |---- container          Laravel 容器组件
    |---- contracts          Laravel 契约组件
    |---- database           ORM 组件
    |---- support            Laravel 辅助组件
  |---- nesbot               Carbon 日期处理组件
  |---- paragonine           随机字符生成组件
  |---- symfony

|---- composer.json composer 包管理配置文件

本系列重点解析 illuminate/database Laravel ORM 组件的分析,仅当有设计到其它组件时再做相关分析。

二、 Laravel ORM 核心组件目录结构

前面我们大致了解了 Laravel ORM 系统整体的目录结构,本节我们重点走进 illuminate/database 文件夹,即 Laravel ORM 核心

2.1 文件结构

|---- database
  |---- Capsule                         文件夹提供非 Laravel 框架以外的系统使用 Laravel ORM 组件的数据库类(Manager.php)
  |---- Concerns                        @TODO
  |---- Connectors                      实现四种数据库的库连接实现类
  |---- Console                         定义 Laravel 数据库迁移(migrate)等相关命令行工具类 
  |---- Eloquent                        ORM 系统实现
  |---- Events                          ORM 处理过程中的事件接口定义
  |---- Migrations                      定义数据库迁移命令行工具对应的数据迁移实现类
  |---- Query                           ORM 查询构造器实现
  |---- Schema                          表空间构造器实现

  |---- ConnectionInterface.php         数据库连接接口,完成数据库连接操作、CURD 、事务等接口方法定义
  |---- Connection.php                  继承自 ConnectionInterface 接口,实现通过 PDO 数据库连接操作,构建数据库查询构造器实例、SQL 语法
                                        解析器实例,实现 CURD、事务、数据绑定处理等操作。

  |---- ConnectionResolverInterface.php @TODO
  |---- ConnectionResolver.php          @TODO

  |---- DatabaseManager.php             供 DatabaseServiceProvider 服务器提供者使用的数据库管理器,功能是管理不同数据库驱动(MySql、Postgres...)的连接实例
  |---- DatabaseServiceProvider.php     @TODO

  |---- DetectsDeadlocks.php            判定给定的数据库异常是否为数据库死锁类型异常
  |---- DetectsLostConnections.php      判断给定的数据库异常是否为断开连接类型异常

  |---- Grammar.php                     @TODO

  |---- MigrationServiceProvider.php    数据库迁移服务提供者

  |---- MysqlConnection.php             MySQL 数据库连接类
  |---- PostgresConnection.php          Postgres 数据库连接类
  |---- SQLiteConnection.php            SQLite 数据库连接类
  |---- SqlServerConnection.php         SQL Server 数据库连接类

  |---- QueryException.php              继承自 PDOException 异常