laravel模型查詢返回的集合,跟基類集合有啥區別?程式設計師小助手2020-09-10 17:45:15

引言

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 :-)

我是@程式設計師小助手,持續分享程式設計知識,歡迎關注。