Laravel5.2中Eloquent与DB类的区别是什么?

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 > AND (code = 'foo' OR 'name' LIKE 'Anvi%') OFFSET LIMIT 5;

可以看到,查询构造层的查询构造器提供了十分直观的访问方式,这种方式使得构建 SQL 语句的错误概率大大降低,而且由于是通过方法访问,我们很容易对某一类查询方式进行封装(这个功能会在后文提到),以提高开发效率。

要时刻记住,所使用的 where 或 groupBy 这类方法,全部是查询构造器提供的方法,要在开发中明确这一点,哪一些方法是由哪一层、哪一个类的实例对象提供的,这样有助于避免不必要的错误.

查询构造器提供了优雅的访问方法,而最终输出 SQL 语句的则是(语法)生成器,他会根据当前所选的数据库驱动生成对应的 SQL 语句,最后返回给查询构造器,组合好用于绑定的参数,调用数据库连接层返回查询结果。

实际上,查询构造器在数据库组件有两个,一个是基础的原生查询构造器,是查询构造层提供的,还有个则是 Eloqent ORM 再次封装的版本,提供了更为高级的关联查询方法

应用层

这一层就是我们长期使用的部分了,这一层包含了三个大组件:Eloquent ORMMigrationSchema

这三个皆是基于查询构造层实现的,Eloquent 出场率最高,当然后两个也很重要,分别是数据迁移和结构生成器,而数据迁移组件和结构生成器作为 最佳组件 CP 往往成双成对的出现。

作为应用层,肯定是基于更为底层的组件实现的,也就是你疑惑的地方。其实想通就好了,无非是 ORM 再次封装并提供了更多的功能(主要是关联查询)。

 

 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112322.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月9日 下午11:00
下一篇 2021年11月10日 上午6:00


相关推荐

  • Kotlin-三目表达式Kotlin版

    Kotlin-三目表达式Kotlin版由于 Kotlin 没有三目表达式这种写法 一般用 ifelse 就可以 但是写起来比较麻烦 于是我便写了个扩展函数 支持 Boolean 和表达式 感觉还行 如果大家有更好的方案 可以留言 authorxuneve createon2021 10 2618 20 description fun T Boolean judge positiveValu T negativeValu T if this T

    2026年3月17日
    2
  • 一文完全理解模型ks指标含义并画出ks曲线(包含代码和详细解释)「建议收藏」

    KS(Kolmogorov-Smirnov):KS用于模型风险区分能力进行评估,指标衡量的是好坏样本累计分部之间的差值。好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。——神秘的KS值和GINI系数上面是ks的简单介绍,相信大家看了这几句话,肯定还是不懂ks到底是个什么。我也是研究了比较久,终于搞清楚了ks的具体计算方式。搞清楚了计算方式后,ks的含义自然就清楚了。下面…

    2022年4月5日
    577
  • BMP文件结构

    BMP文件结构BMP 全称 Bitmap 是 Window 操作系统中的标准图像文件格式可以分成两类 设备相关位图 DDB 和设备无关位图 DIB 使用非常广 它采用位映射存储格式 除了图像深度可选以外 不采用其他任何压缩 因此 BMP 文件所占用的空间很大 BMP 文件的图像深度可选 1bit 4bit 8bit 24bit 及 32bit BMP 文件存储数据时 图像的扫描方式是按从左到右 从下到上的顺序 由于 BMP

    2026年3月18日
    3
  • 订单超时取消之延迟队列

    订单超时取消之延迟队列延迟队列的用法 了解一下

    2026年3月17日
    2
  • 欧拉角以及方向余弦

    欧拉角以及方向余弦目前 描述两个坐标系之间关系的常用方法主要有欧拉角法 方向余弦矩阵法和四元数法 因此要弄懂这三种方法的定义及关系 我们必须先从坐标系转化开始了解 下面以四旋翼为例 定义两个坐标系 导航坐标系 参考坐标系 n 选取东北天右手直角坐标系作为导航坐标系 n 载体坐标系 机体坐标系 b 选取右手直角坐标系定义 四轴向右为 X 正方向 向前为 Y 轴正方向 向上为 Z 轴正方向 nbsp 欧拉角 欧拉角是一种常用的描述方位

    2026年3月18日
    2
  • 超详细~Windows下PyCharm配置Anaconda环境教程

    超详细~Windows下PyCharm配置Anaconda环境教程目录首先来明确一下 Python PyCharm 和 Anaconda 的关系那么如何将 Anaconda 集成到 PyCharm 中呢 1 安装 Anaconda 2 在 PyCharm 导入 Anaconda 3 在 Anaconda 中安装新的 Python 包首先来明确一下 Python PyCharm 和 Anaconda 的关系 1 Python 是一种解释型 面向对象 动态数据类型的高级程序设计

    2026年3月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号