深入研究 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 [email protected]: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 异常

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Coding01

推荐一个命令行应用开发工具——Laravel Zero

今天在 Laravel News 网站无意间看到「Laravel Zero」,主要被这个 Slogan 吸引住了。

1292
来自专栏马洪彪

Java设计模式(七)Decorate装饰器模式

一、场景描述 (一)问题 系统中最初使用Crystal Report(水晶报表)工具生成报表,并将报表发送给客户端查看,此时定义一CrystalReport工具...

4419
来自专栏安恒网络空间安全讲武堂

2018全国大学生软件测试大赛-安恒杯Web测试大赛write up

这里的知识点是当代码中存在$_REQUEST['user_id']里面类似的参数的时候,使用" "、"["、"+"、"."这样的符号的时候回自动转化成"_"从而...

2781
来自专栏Golang语言社区

设计Go API的管道使用原则

管道是并发安全的队列,用于在Go的轻量级线程(Go协程)之间安全地传递消息。总的来讲,这些原语是Go语言中最为称道的特色功能之一。这种消息传递范式使得开发者可以...

3736
来自专栏JavaEdge

服务网关和 Zuul0 简介1 实践

网关是具体核心业务服务的看门神,相比具体实现业务的系统服务来说它是一个边缘服务,主要提供动态路由,监控,弹性,安全性等功能,下面我们从单体应用到多体应用的演化过...

1451
来自专栏纯洁的微笑

分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储

3183
来自专栏张善友的专栏

[腾讯社区开放平台]介绍开放授权协议-OAuth

OAuth (开放授权) 是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所...

2667
来自专栏WindCoder

《Linux内核分析》之分析system_call中断处理过程实验总结

先占个位置,在实验楼做实验,刚做完一半忘了延续时间,结果之前写的代码神马的全没了。让我先去角落哭会,总结明天再写。2015-04-04

881
来自专栏腾讯大数据的专栏

网卡收包流程

0.前言 为提升信鸽基础服务质量,笔者就网络收包全流程进行了内容整理。 网络编程中我们接触得比较多的是socket api和epoll模型,对于系统内核和网卡驱...

2.1K14
来自专栏IT技术精选文摘

Hbase 技术细节笔记(上)

前言 最近在跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hbase的理解,对相关知识点做了笔记,并在组内...

2549

扫码关注云+社区

领取腾讯云代金券