本篇教程是該系列教材的第二篇,將主要講述 Eloquent 中中間操做流的概念。中間操做流是我本身總結並翻譯的概念,支撐該功能的類位於 Illuminate\Database\Eloquent\Builder,此概念對於新手入門有很大幫助,可是官方文檔沒有相關概念和解釋。
php
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;
而後你就會看到下面的錯誤:函數
爲何會出現錯誤?由於 `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);