深入理解 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—中间操作流(Builder)miss error

首先,数据库大都是链式操作,在laravel中,出现一个builder的定义,可以理解为中间流操作,或者是中间构造器。 自己遇到的错误:Undefined property: Illuminate\...
  • sinat_37007443
  • sinat_37007443
  • 2017年03月30日 17:33
  • 290

laravel5 爬坑之如何使用modle-Eloquent ORM

首先,什么是Eloqent ORM  官方手册是如此解释的:“Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库的互动。 每个数据库表会和一个对...
  • qq_16619361
  • qq_16619361
  • 2017年04月17日 16:54
  • 471

laravel笔记-Eloquent ORM(关联关系)

laravel笔记-Eloquent ORM(关联关系)写在前面时间可贵,善用目录↑学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。什么是关联关系这么说,...
  • zjiang1994
  • zjiang1994
  • 2017年08月14日 12:07
  • 757

laravel Eloquent ORM

Eloquent 是 Laravel 的 'ORM',即 'Object Relational Mapping',对象关系映射。ORM 的出现是为了帮我们把对数据库的操作变得更加地方便。 Eloque...
  • xijingre
  • xijingre
  • 2015年06月10日 14:36
  • 1732

laravel Eloquent:Collection

laravel Eloquent:Collection 怎么说呢,自己的记录远远没有文档说的好,也没有文档给的详细,全当自己理解的一个记录吧。 详细文档地址链接下面是我关于对Eloquent:co...
  • sinat_37007443
  • sinat_37007443
  • 2017年03月30日 21:55
  • 210

Laravel Eloquent使用小记

文章保存地址:https://github.com/wanguowan/notetext-blog/blob/master/Eloquent.mdLaravel Eloquent使用小记今天因为开发数...
  • wan353694124
  • wan353694124
  • 2016年11月15日 01:12
  • 4688

JAVA IO流深入理解

摘要: Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 ...
  • LoveStudy_girl
  • LoveStudy_girl
  • 2016年06月23日 14:33
  • 3702

laravel的Eloquent其他笔记

1.集合: Eloquent返回的所有的包含多条记录的结果集都是 'Illuminate\Database\Eloquent\Collection' 对象的实例。例如:通过 get(),all()等...
  • beyond__devil
  • beyond__devil
  • 2017年01月08日 13:48
  • 737

Laravel5入门Eloquent ORM总结

阅读Laravel5.1的手册时,发现有些地方没有翻译完成,还是英文状态。为了加深对Laravel的Eloquent的认识,总结了一些入门Eloquent的地方,大部分代码摘自手册,都做了注释: ...
  • misakaqunianxiatian
  • misakaqunianxiatian
  • 2016年11月08日 22:06
  • 783

laravel的Eloquent模型

光看一遍手册,都记不住,做点笔记,加深印象 1.默认的Eloquent模型,存放在app目录下,这点不是特别好,建议在app中,创建一个 “Model”,专门存放模型文件。 手册中提到:可以将它们...
  • beyond__devil
  • beyond__devil
  • 2016年09月27日 18:24
  • 1423
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解 Laravel Eloquent(二)——中间操作流(Builder)
举报原因:
原因补充:

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