Laravel5.2中Eloquent与DB类的区别是什么?
要了解这些先看看关于数据库组件的那些事儿(就是 Eloquent ORM)
数据库组件大概分了三层:
数据库连接层
查询构造层
应用层
来看一下每一层有哪些东西,分别对应文档的哪一部分:
数据库连接层
数据库连接层是整个数据库组件依赖的基础,这个不言而喻,但是这部分实际上从 文档 都能够看得出,本身更多是基于 PDO
的封装,在此基础上提供了以下几个主要功能:
更为直观易用的事务
读写分离功能
多种数据库驱动兼容和切换
数据库事件
这一部分的功能可以通过 Facade 快捷调用(DB 类),文档已有说明,很明显,只要是使用过 PDO
或者 MySQLi 的都能够快速上手使用参数绑定和 SQL 预处理功能。为了便于事件处理,这一部分对增删改查四个操作每一个都封装了一个方法,实际上调用方法一致(都是封装的 PDO 和 PDOStatement 类的方法),仅产生的结果类型有所区别。
这一层很底层,对于需要直接手写 SQL 操作数据库的人可以通过这一层访问,大多数情况下我们不会直接使用(不过事务很常用,我们会在后面的文章讲到)。需要注意的是,作为底层,意味着数据库组件后面所有的功能都是利用这一层实现的,因此这一层务必需要有一个了解。
查询构造层
查询构造层由 查询构造器
和 (语法)生成器
组成,是应用层和底层沟通的桥梁,其提供了流畅的访问接口,使得开发者可以以务必优雅的形式创建查询。虽然现代框架都提供了此类功能,但像 Laravel 这种利用很多 PHP 优秀特性来实现的,很少很少。
你可以通过这样的方式查询:
<?php
$query = DB::table('users')->where('score', '>', 0)
->where(function (Builder $query) {
$query->where('code', 'foo')
->orWhere('name', 'like', 'Anvi%');
})->skip(1)
->take(5)
->get();
最终会生成这样的 SQL:
SELECT * FROM users WHERE score > 0 AND (code = 'foo' OR 'name' LIKE 'Anvi%') OFFSET 1 LIMIT 5;
可以看到,查询构造层的查询构造器提供了十分直观的访问方式,这种方式使得构建 SQL 语句的错误概率大大降低,而且由于是通过方法访问,我们很容易对某一类查询方式进行封装(这个功能会在后文提到),以提高开发效率。
要时刻记住,所使用的 where 或 groupBy 这类方法,全部是查询构造器提供的方法,要在开发中明确这一点,哪一些方法是由哪一层、哪一个类的实例对象提供的,这样有助于避免不必要的错误.
查询构造器提供了优雅的访问方法,而最终输出 SQL 语句的则是(语法)生成器,他会根据当前所选的数据库驱动生成对应的 SQL 语句,最后返回给查询构造器,组合好用于绑定的参数,调用数据库连接层返回查询结果。
实际上,查询构造器在数据库组件有两个,一个是基础的原生查询构造器,是查询构造层提供的,还有个则是 Eloqent ORM 再次封装的版本,提供了更为高级的关联查询方法
应用层
这一层就是我们长期使用的部分了,这一层包含了三个大组件:Eloquent ORM
、Migration
、Schema
。
这三个皆是基于查询构造层实现的,Eloquent 出场率最高,当然后两个也很重要,分别是数据迁移和结构生成器,而数据迁移组件和结构生成器作为 最佳组件 CP
往往成双成对的出现。
作为应用层,肯定是基于更为底层的组件实现的,也就是你疑惑的地方。其实想通就好了,无非是 ORM 再次封装并提供了更多的功能(主要是关联查询)。
Laravel5.2中Eloquent与DB类的区别是什么?的更多相关文章
- 封装自己的DB类(PHP)
封装一个DB类,用来专门操作数据库,以后凡是对数据库的操作,都由DB类的对象来实现.这样有了自己的DB类,写项目时简单的sql语句就不用每次写了,直接调用就行,很方便! 1.封装一个DB类.一个类文件 ...
- Jfinal中Db类的的使用
Jfinal提供了两种操作数据库的组件,分别是Model类和DB类,可以极大地减少代码量,提高开发效率. Db类提供了在Model类之外更丰富的的数据库操作能力,使用Db类以及嵌套的Record类时, ...
- Dingo Api 1.0在laravel5.2中的简单应用
Dingo Api是为基于laravel的开发提供了一系列工具集,这些工具集可以帮助开发者快速构建API.Dingo Api最新的版本是2.0.0-alpha1,这个版本需要php7.0以上的php版 ...
- nodejs操作mongodb数据库封装DB类
这个DB类也算是我经历了3个实际项目应用的,现分享出来,有需要的请借鉴批评. 上面的注释都挺详细的,我使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关 ...
- 封装DB类
封装DB类 一般一个类单独书写在一个Php文件中,为了见名知意,会对文件名有一个规范:类名.class.php 第1步: 创建DB类 第2 步: 属性设计 第3步: 初 ...
- TP5 模型类和Db类的使用区别
原文:http://www.upwqy.com/details/3.html 总结 在控制器中 模型操作 get() 和 all() 只能单独使用来查询数据 想要链式操作查询数据 需要使用f ...
- PHP——laravel之DB类->查询
DB类之查询: 满足条件的全部获取:DB::table("表名")->where("name",">","1" ...
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- nodejs mongodb 数据库封装DB类 -转
使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关于mongoose的安装就是 npm install -g mongoose 这个DB类的数据库配置是 ...
随机推荐
- vscode快捷操作
Ctrl + ` 打开或关闭终端 Ctrl + Shift + n 打开或关闭新窗口 Ctrl + Shift + f 打开视图,显示编辑器左侧 ...
- OO方式实现ALV: cl_salv_table
这里总结最近用cl_salv_table实现ALV遇到问题和解决办法 FORM set_alv2 . DATA: lv_syrepid TYPE syrepid. lv_syrepid = sy-cp ...
- WinForm - 不用自绘实现仿QQ2013
素材啥的都是一手整理的,绝对的原创.这是13年做的,虽然是个老项目了,可里面涉及的winform技术不会过时,所以就拿出来重温探讨下技术要点. 没使用任何自绘命令,可以说是非常容易理解与学习的. 效果 ...
- Linux下安装opencv with-ffmpeg解决无法读取视频的问题
1. 编译安装ffmpeg 下载源码,执行 ./configure --disable-yasm --enbale-shared --prefix=/usr/local/ffmpeg 即可. 2. 下 ...
- 【网络协议】动态主机配置协议DHCP
动态主机配置协议DHCP 当某组织获得一块地址后,就可以为本组织内的主机或者路由器分配IP地址.这个分配工作可以由系统管理员手动通过网络管理工具来完成.也可以由动态主机配置协议(Dynamic Hos ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)]
[易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)] 项目实战 实战2:命令行工具minigrep 我们继续开发我们的minigrep. 我们现 ...
- .NET平台的发展
.NET平台的发展.NET从1.0到.NET Core3.0:C#从1.0到8.0: ASP.NET从1.0到Core3.0: ASP.NET MVC1.0到ASP.NET MVC6.0,
- mysql索引设计的注意事项
mysql索引设计的注意事项 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过key_len确定究竟使用 ...
- MySQL 异地 双机房同步之otter
一.背景: 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求, 同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了ott ...
- [Javascirpt] What’s new in JavaScript (Google I/O ’19)
Private variable in class: class Counter { #count = 0; // cannot be access publicly get value () { r ...