小解惑:查詢構造器與集合中的 get 方法

hehorange發表於2018-12-19

在用查詢構造器或 Eloquent 進行資料的獲取時,通常會遇到這種情況:

// 取全部
DB::table('users')->get();     // 查詢構造器中沒有 all 方法
User::get();
User::all();
// 取特定數量
DB::table('users')->take(3)->get();
DB::table('users')->get()->take(3);
User::all()->take(3);
User::take(3)->get();

先說下結果,上面的程式兩種方式取出的結果相同,只是資料型別不同(執行效率那就另說了):
查詢構造器取出的是 Laravel 的「集合基類」,即 Illuminate\Support\Collection
Eloquent 取出的是 「Eloquent 集合」,即 Illuminate\Database\Eloquent\Collection,而 Eloquent 集合又是繼承於集合基類。

那麼問題來了,怎麼有時候有 get(),有時候沒有?
那就要先去 API 文件裡找一下這個 get 方法,Laravel 中 get 方法很多,我們要找的查詢構造器、 Eloquent 和 Collection 的。
查詢構造器中(Illuminate\Database\Query\Builder):
file
如上所說,“像用 select 語句查詢一樣”。跟在查詢構造器後,返回一個集合。

而集合(Illuminate\Support\Collection) 中的 get 則是另外一回事了,是從已有集合中取出需要的欄位。
file

所以上面示例程式碼中的 get() 全部是查詢構造器中的,返回集合。按文件中的介紹,Eloquent 也可以看作是查詢構造器,具體是怎麼實現的,我修行尚淺,現在還不懂。

take() 呢?在查詢構造器中,take 是設定 limit 查詢的別名,來看 limit()
file
注意,返回的是 $this,還是查詢構造器。
再看集合中的 take,是從結果集中返回給定數量項的新集合。


現在知道什麼時候加 get 了,總結一下

  1. 要從查詢構造器例項中獲取結果時,加;
  2. 如果已經是個集合了,那再 ->get() 是要出錯的,除非加上引數,->get('key'),則表示從結果集中返回指定鍵的條目;
  3. 如果要限制數量,查詢構造器和集合後面都可以跟 ->take(N),但注意,兩個 take 不是同一個方法。

相關文章