在用查詢構造器或 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
):
如上所說,“像用 select 語句查詢一樣”。跟在查詢構造器後,返回一個集合。
而集合(Illuminate\Support\Collection
) 中的 get 則是另外一回事了,是從已有集合中取出需要的欄位。
所以上面示例程式碼中的 get() 全部是查詢構造器中的,返回集合。按文件中的介紹,Eloquent 也可以看作是查詢構造器,具體是怎麼實現的,我修行尚淺,現在還不懂。
那 take()
呢?在查詢構造器中,take 是設定 limit 查詢的別名,來看 limit()
:
注意,返回的是 $this,還是查詢構造器。
再看集合中的 take,是從結果集中返回給定數量項的新集合。
現在知道什麼時候加 get 了,總結一下:
- 要從查詢構造器例項中獲取結果時,加;
- 如果已經是個集合了,那再
->get()
是要出錯的,除非加上引數,->get('key')
,則表示從結果集中返回指定鍵的條目; - 如果要限制數量,查詢構造器和集合後面都可以跟
->take(N)
,但注意,兩個 take 不是同一個方法。
本作品採用《CC 協議》,轉載必須註明作者和本文連結