二、深刻理解 Laravel Eloquent(二)——中间操做流(Builder)

深刻理解 Laravel Eloquent(二)——中间操做流(Builder)

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

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

Builder 这个单词能够直译成构造器,可是“中间操做流”更容易理解,由于数据库操做大部分时候都是链式操做的。html

中间操做流,请看代码:laravel

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

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

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

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

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

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

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

而后你就会看到下面的错误:函数

Image

为何会出现错误?由于 `Article::where()` 了以后依然是 `Builder` 对象,还不是 `Article` 对象,不能直接取 `title`。ui

“终结者”方法

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

`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);
相关文章
相关标签/搜索