laravel模型查詢返回的集合,跟基類集合有啥區別?
引言
laravel在功能拆分上相當靈活,其中查詢返回的資料集,雖然繼承了基類集合, 但是有一些特定的方法和用法。很多小白在寫的時候,往往分不清到底是用的哪個類的哪個方法,導致憑空報錯。本文就來為大家梳理梳理。
程式碼時間
laravel系統的基類就是
Illuminate\Support\Collection
,同時提供了一個快捷助手函式collect 用於例項化一個集合類。該助手函式的程式碼很簡單,就是new一個物件:
new Collection($value);
比如有一個數組,將其例項化為一個集合類:
$collection = collect([1, 2, 3]);
集合類可以呼叫系統提供的方法,非常靈活地操作資料。比如將上述陣列內所有的偶數剔除掉:
$odds = $collection->reject(function ($item) { return $item % 2 === 0; });
reject方法接收一個匿名函式,滿足條件的將被從集合中剔除。
或者把集合內所有的資料乘以10返回,我們呼叫map方法進行遍歷:
$multiplied = $collection->map(function ($item) { return $item * 10; });
上面說的方法都是鏈式可操作的,可以把操作一氣呵成,比如返回陣列中所有的偶數,並將所有元素乘以10,最後求和。 直接貼程式碼:
$sum = $collection->filter(function ($item) { return $item % 2 == 0; })->map(function ($item) { return $item * 10; })->sum();
是不是比寫foreach迴圈運算元組流暢直觀的多了?
雖然eloquent collection繼承了基類Collection的特性,但是對於模型類的特性 有許多獨特的方法。比如 modelKeys() 返回所有集合模型的primary key。比如呼叫 find($id) 的方法返回的是根據模型例項的primary id查詢到的模型物件。
這與原始的集合的方法都有著本質的不同。系統自帶的方法在複雜應用下不能滿足多元化的需求, 我們這時就需要手動自建集合類,用於特定的操作。
比如在訂單模型內,把所有已經支付的訂單進行求和返回。我們手動建立一個eloquent collection 用於操作query builder返回的資料集合。
use Illuminate\Database\Eloquent\Collection; class OrderCollection extends Collection { public function sumBillableAmount() { return $this->reduce(function ($carry, $order) { return $carry + ($order->billable ? $order->amount : 0); }, 0); } }
然後在模型內進行註冊:
class Order extends Model { public function newCollection(array $models = []) { return new OrderCollection($models); } }
那麼在程式碼中就可以這樣用:
$orders = Order::all(); $billableAmount = $orders->sumBillableAmount();
注意使用all方法返回的是一個eloquent collection集合。這樣把一些運算操作放在程式內,而非資料庫SQL 語句內進行,可進一步提高效率。
對於集合的序列化操作,其實有很標準的寫法,比如 toArray toJson這些方法, 可以在返回的資料集物件上直接呼叫:
$contactArray = Contact::first()->toArray(); $contactJson = Contact::first()->toJson(); $contactsArray = Contact::all()->toArray(); $contactsJson = Contact::all()->toJson();
序列化,或者說格式化牽涉的內容比較多,實際使用也很複雜。此處我們不展開說明了。
寫在最後
本文展示了eloquent collection物件的相關操作和方法,大家注意區別於常規的集合類。
Happy coding :-)
我是@程式設計師小助手,持續分享程式設計知識,歡迎關注。