深入理解 Laravel Eloquent(二)——中间操作流(Builder)

转载 2015年07月07日 16:19:46

本篇教程是该系列教材的第二篇,将主要讲述 Eloquent 中中间操作流的概念。中间操作流是我自己总结并翻译的概念,支撑该功能的类位于 Illuminate\Database\Eloquent\Builder,此概念对于新手入门有很大帮助,但是官方文档没有相关概念和解释。

什么是“中间操作流”(Builder)

Builder 这个单词可以直译成构造器,但是“中间操作流”更容易理解,因为数据库操作大部分时候都是链式操作的。

中间操作流,请看代码:

Article::where('id', '>', 10)->where('id', '<', 20)->orderBy('updated_at', 'desc')->get();

这段代码的 `::where()->where()->orderBy()` 就是中间操作流。中间操作流用面向对象的方法来理解,可以总结成一句话:

创建一个对象,并不断修改它的属性,最后用一个操作来触发数据库操作。

但是,我们都知道,如果直接用 :: 来访问某个 function,无论这个 function 是否为 static,构造函数 __construct() 都不会被调用,那么创建对象是如何实现的呢?请看:https://github.com/illuminate/database/blob/master/Eloquent/Model.php#L3354

如何找到中间操作流的蛛丝马迹

中间操作流这个东西,文档里几乎没有任何有价值的信息,那么,我们该怎么找出这个玩意儿呢?很简单,使用以下代码:

$builder = Article::where('title', "我是标题")->title;

然后你就会看到下面的错误:

Image

为什么会出现错误?因为 `Article::where()` 了之后依然是 `Builder` 对象,还不是 `Article` 对象,不能直接取 `title`。

“终结者”方法

所谓 “终结者” 方法,指的是在 N 个中间操作流方法对某个 Eloquent 对象进行加工以后,触发最终的数据库查询操作,得到返回值。

`first()` `get()` `paginate()` `count()` `delete()` 是用的比较多的一些 “终结者” 方法,他们会在中间操作流的最后出现,把 SQL 打给数据库,得到返回数据,经过加工返回一个 Article 对象或者一群 Article 对象的集合。

复杂用法示例

Article::where('id', '>', '100')->where('id', '<', '200')->orWhere('top', 1)->belongsToCategory()->where('category_level', '>', '1')->paginate(10);

下一步:深入理解 Laravel Eloquent(三)——模型间关系(关联)

相关文章推荐

深入理解 Laravel Eloquent(一)——基本概念及用法

在本系列文章中,我将跟大家一起学习 Eloquent 的基本用法,探索 Eloquent 的各种高级功能,理解 Eloquent 背后的运行原理,并最终达到深入理解、灵活使用 Eloquent 的目的...
  • sqzhao
  • sqzhao
  • 2015年07月07日 16:18
  • 524

深入理解 Laravel Eloquent(三)——模型间关系(关联)

在本篇文章中,我将跟大家一起学习 Eloquent 中最复杂也是最难理解的部分——模型间关系。官方英文文档中叫 Relationships,个人认为翻译成 “模型间关系” 比现在的 “关联” 更好理解...
  • sqzhao
  • sqzhao
  • 2015年07月07日 16:21
  • 512

Laravel学习笔记(七)---操作数据库--Eloquent ORM--关联关系及其在模型中的定义

关联关系及其在模型中的定义 用户表:users 社交账号表:user_accounts 文章表:posts 角色表:roles 中间表:role_user(用于记录users表与role...
  • tiansan
  • tiansan
  • 2017年04月01日 11:30
  • 871

Laravel学习笔记(六)---操作数据库--Eloquent ORM(对象关系映射)

Eloquent ORM(对象关系映射) ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的...
  • tiansan
  • tiansan
  • 2017年04月01日 11:28
  • 2510

laravel学习笔记(4)— 数据库操作之 - Eloquent ORM

1.Eloquent ORM简介、模型的建立及查询数据  ●  laravel所自带的Eloquent ORM是一个优美、简洁的ActiveRecord实现,用来实现数据库操作。  ●  每个数据表都...
  • Burgdan
  • Burgdan
  • 2017年04月30日 20:15
  • 701

php Laravel框架学习(二) 之 Eloquent 基础

php Laravel框架学习(二) 之 Eloquent 基础 本文重点

php Laravel框架学习(二) 之 Eloquent 高级应用

php Laravel框架学习(二) 之 Eloquent 高级

在Laravel外使用Eloquent(二)- 分页问题

在上一篇《在Laravel外使用Eloquent(一)》 中我们演示了如何引入Eloquent以及基本使用,但是如果细心的朋友肯定会发现,当你在使用paginate(15)来分页的时候是会报错的。因为...
  • fatigue
  • fatigue
  • 2015年01月07日 17:50
  • 1920

Laravel学习笔记(五)---操作数据库--查询构建器(Query Builder)

查询构建器(Query Builder) 1、新增数据 使用查询构建器的insert方法即可插入一条/多条数据: DB::table('users')->insert([     ['...
  • tiansan
  • tiansan
  • 2017年04月01日 09:05
  • 1185

Laravel 学习笔记——路由(中间件与路由组)

上一部分讲述了laravel路由的基本用法,现在我们要了解更多路由上的内容。 本文包含以下小节,在阅读之前建议大致阅读官方文档相关部分。 中间件路由组 中间件 在官方文档上...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解 Laravel Eloquent(二)——中间操作流(Builder)
举报原因:
原因补充:

(最多只允许输入30个字)