Laravel 有三宝,路由、容器和 Eloquent ORM,Eloquent ORM 实际上是 Laravel 框架数据库组件的一个部分,也是最为重要和常用的,所以我们在说 Laravel 数据库组件时,往往指的是 Eloquent ORM。当然,数据库篇的文章肯定要全面讲述,这样有助于理解,也能帮助一些在这一块遇到问题的朋友。
composer
安装的话,可以在任意一个项目里使用该组件的全部功能,而不需要安装 laravel 框架。具体使用方法可到其 github 主页获取:https://github.com/illuminate/database
漂亮的结构
Laravel 数据库组件有着明确的分层,虽然没有直白的说明,但仍旧能够从文档结构、代码中明显看得出来。笔者也会按每一层来讲解,当然,由于 Eloquent ORM 占比最高,我将用两个篇幅来着重讲述。
组件大概分了三层:
- 数据库连接层
- 查询构造层
- 应用层
来看一下每一层有哪些东西,分别对应文档的哪一部分:
数据库连接层
数据库连接层是整个数据库组件依赖的基础,这个不言而喻,但是这部分实际上从 文档都能够看得出,本身更多是基于 PDO
- 更为直观易用的事务
- 读写分离功能
- 多种数据库驱动兼容和切换
- 数据库事件
PDO
这一层很底层,对于需要直接手写 SQL 操作数据库的人可以通过这一层访问,大多数情况下我们不会直接使用(不过事务很常用,我们会在后面的文章讲到)。需要注意的是,作为底层,意味着数据库组件后面所有的功能都是利用这一层实现的,因此这一层务必需要有一个了解。
了解 PDO 很重要,现代框架数据库部分基本是基于 PDO 实现的。若是作为一名使用到 PHP 5.3 以后版本的 PHPer,连 PDO 都未曾使用甚至都不曾了解的,着实应当面壁,要知道 PDO 可是从 PHP 5.1 以后就已经是一个自带扩展,随 PHP 一同发布。
这一部分不会单独成文介绍,而是会随着下面这一部分,在下一篇文章中同时给出讲述。
查询构造层
查询构造器
和 (语法)生成器
你可以通过这样的方式查询:
1. <?php
2. $query = DB::table('users')->where('score', '>', 0)
3. ->where(function (Builder $query) {
4. $query->where('code', 'foo')
5. ->orWhere('name', 'like', 'Anvi%');
6. })->skip(1)
7. ->take(5)
8. ->get();
最终会生成这样的 SQL:
1. SELECT * FROM users WHERE score > 0 AND (code = 'foo' OR 'name' LIKE 'Anvi%') OFFSET 1 LIMIT 5;
可以看到,查询构造层的查询构造器提供了十分直观的访问方式,这种方式使得构建 SQL 语句的错误概率大大降低,而且由于是通过方法访问,我们很容易对某一类查询方式进行封装(这个功能会在后文提到),以提高开发效率。
要时刻记住,所使用的 where 或 groupBy 这类方法,全部是查询构造器提供的方法,要在开发中明确这一点,哪一些方法是由哪一层、哪一个类的实例对象提供的,这样有助于避免不必要的错误,这一点我会在 Eloqent 的那一篇文章中着重讲。
查询构造器提供了优雅的访问方法,而最终输出 SQL 语句的则是(语法)生成器,他会根据当前所选的数据库驱动生成对应的 SQL 语句,最后返回给查询构造器,组合好用于绑定的参数,调用数据库连接层返回查询结果。
实际上,查询构造器在数据库组件有两个,一个是基础的原生查询构造器,是查询构造层提供的,还有个则是 Eloqent ORM 再次封装的版本,提供了更为高级的关联查询方法,这个会在后续着重讲解。
应用层
Eloquent ORM
、Migration
、Schema
。最佳组件 CP
Eloquent 作为最最重要的部分,戏份也最多,我将分为几个篇章来介绍:
- 模型与数据库(一些思想上的东西)
- Eloquent ORM 基础 (讲解 Laravel 的模型,Eloquent 基础,集合)
- Eloquent ORM 高级运用 (可复用查询封装,事件的运用,Getter 与 Setter)
- 关联查询(各种关联模型的运用实例,关联查询各种问题,由于内容很多,将会分为两篇来讲)