iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Software Development

跟著官方文件學習Laravel, 並實作出一個會員登入系統系列 第 23

Day23 跟著官方文件學習Laravel-Collection

  • 分享至 

  • xImage
  •  

Laravel提供了一個方便且好用的方式包裝資料,並提供一系列方法處理資料,方便你在處理業務邏輯的同時清楚描述你的程式在做什麼。

他實作了以下介面使得它具有更多的功能性,包含

ArrayAccess
Countable
IteratorAggregate
JsonSerializable

Arrayable
Jsonable

以下會整理一些我在官方文件上看到Collection使用方法及我可能會常使用的method。

如何創建collection

  1. 利用全域方法collect即可將物件轉化成collection
$collection = collect([1, 2, 3]);
  1. static method
$collection = Collection::make([1, 2, 3]);
  1. new Collection
$collection = new Collect([1, 2, 3]);

可擴展性

我們可以利用macro方法,透過closure去達成延展功能。這例子是幫它添加一個toUpper方法

Collection::macro('toUpper', function () {
    return $this->map(function ($value) {
        return Str::upper($value);
    });
});

$collection = collect(['first', 'second']);

$upper = $collection->toUpper();

可用方法

他提供非常多的方法,我這邊簡單整理一些我在實務中有用過的一些方法

  1. only

only可以將你的Collection篩選出你想要的key

$collection = collect([
    'product_id' => 1,
    'name' => 'Desk',
    'price' => 100,
    'discount' => false
]);

$filtered = $collection->only(['product_id', 'name']);

$filtered->all();

// ['product_id' => 1, 'name' => 'Desk']
  1. map
    可以對這個Collection中的元素去做一些改變
$collection = collect(['taylor', 'abigail', null])->map(function ($name) {
    return strtoupper($name);
});

  1. filter
    可以對這個Collection中的元素去做一些篩選
$collection = collect([1, 2, 3, 4]);

$filtered = $collection->filter(function ($value, $key) {
    return $value > 2;
});

$filtered->all();

等等,還有很多可以摸索的功能,我也沒有全部都用過,等到之後有需求時,再來翻翻。

再來我要介紹的是另一個Eloquent collection,Eloquent方法中回傳的是Illuminate\Database\Eloquent\Collection類的實例,他也繼承了基礎的collection,所以可以使用基礎collection的方法。

$names = User::all()->reject(function ($user) {
    return $user->active === false;
})->map(function ($user) {
    return $user->name;
});

不過有一點要注意的是絕大多數的方法在Eloquent collection中回傳是Eloquent collection,但有些方法他回傳的會是base collection,包括以下。

好~今天就看到這邊,明天再來看看其他有趣的功能吧!


上一篇
Day22 跟著官方文件學習Laravel-Hash
下一篇
Day24 跟著官方文件學習Larave-Dusk
系列文
跟著官方文件學習Laravel, 並實作出一個會員登入系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言