优雅使用 illuminate/database 包中的 Collection
優雅使用 illuminate/database 包中的 Collection
或許你很抵抗使用 Laravel , 但是你沒有理由不喜歡使用 illuminate/database。這是一個 ORM 的類庫。我個人認為,這個類庫你是否用的好,其中很重要的一點就是你是否能用好 Collection 這個數據結構,Collection 這個數據結構的源碼在 Illuminate\Database\Eloquent\Collection。
Collection 這個數據結構有很多方法。各種方法有很多其實都是重復的。官方文檔 里面有最全的示例和說明。當不了解一個函數的使用的時候,翻看官方文檔是最好的選擇。
我這里想介紹一些我在實際工作生活中覺得 Collection 最有用的一些方法。
首先,我把 Collection 的方法做了一下分類。
前提
這篇介紹的 illuminate/database 版本為5.6
例子中使用的 user 表的結構和數據如下:
ORM 相關
load
這里面的 load 方法是非常有用的。它的用處在于把一個 Model 關聯的集合給一次性關聯查詢出來。結合illuminate/database 的相關 relation 是非常有用的
use AppComment;
class User extends IlluminateDatabaseEloquentModel
{
protected $table = "user";
public function comments()
{
$this->hasMany(AppComment)
}
}
$users = User::all();
$users->load('comments');
find
如果你要按照主鍵進行查找,那么 find 方法是你最好的選擇。
$users = User::all();
$user = $users->find(1);
構造類
基本我經常用的只有一個 make 方法。
make
$arr = [1,2,3];
$collection = Collection::make($arr);
提取類
pluck, unique
這兩個用的非常多,比如我需要獲取 user 表中 所有的 weight 值:
$users = User::all();
$weights = $users->pluck('weight')->unique();
keyBy
如果我需要獲取我得到的這批數據以某個字段為key,這種很經常用在有一個非主鍵的唯一鍵的情況。
$users = User::all();
$users = $users->keyBy('name');
計算類
計算類的函數就使用非常多了,在各種邏輯中都會用到
max, min, avg, random
$users = User::all();
$maxWeight = $users->max('weight');
$minWeight = $users->min('weight');
$avgWeigth = $users->avg('weight');
$randomUser = $users->random();
判斷類
contains
我認為 contains 是用來判斷這個數組中是否包含最好用的方法,語義啥的都是最好的,沒有之一了。
$users = User::all();
$isContain = $users->contains(function($user) {
return $user->weight > 33;
});
查找過濾類
這一類的各個函數估計有很多都重復了。基本上掌握 where 系列的語句就能滿足各種查找過濾需求了。如果再復雜一點的過濾查找邏輯,就使用filter。
$users = User::all();
$overWeightUsers = $users->where('weight', '>', 33);
$firstUser = $users->first();
$firstOverWeightUser = $users->firstWhere('weight', '>', 33);
$nameOkUsers = $users->filter(function($user) {
return ucfirst($user->name) == 'Test4';
});
重組類
重組類的功能非常好用,這類方法用的好,會讓你的代碼優美很多。而且會享受到函數式編程的快感。
map, reduce
這兩個函數的使用就是和其他函數式語言的一樣。
$sumShowWeight = $users->map(function($user) {
return ['name' => $user->name, 'show_weight' => $user->weight + 10];
})->reduce(function($carry, $item) {
return $carry + $item['show_weight'];
});
我這里獲取所有用戶經過計算之后的 show_weight 的 sum 值,這么一句就可以搞定了。
transform
對集合內每個元素都進行操作從而重組一個新的集合:
$showUsers = $users->transform(function($user) {
return ['name' => $user->name, 'show_weight' => $user->weight + 10];
});
groupBy
groupBy也是很常用的,它不僅可以把所需要字段的唯一值獲取出來,而且可以獲取出每個唯一值有哪些分組。
$users = User::all();
$groupUsers = $users->groupBy('weight');
排序類
排序類一般和其他的函數一起使用。比如獲取最輕的用戶:
$users = User::all();
$lessWeightUser = $users->sortBy('weight')->first();
思考
illuminate/database 提供的 Collection 函數已經是非常靈活和強大了。如果一定要有一個標準判斷你的代碼寫的好不好,那么一定是代碼行數是否夠少。而 Collection 使用的函數能讓我們的代碼行數大大壓縮。全面系統思考下這些函數的使用場景是一個能讓你的代碼越來月優雅的方式。
參考文檔
https://scotch.io/tutorials/laravel-collections-php-arrays-on-steroids
總結
以上是生活随笔為你收集整理的优雅使用 illuminate/database 包中的 Collection的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大众点评APP分析随笔
- 下一篇: html跳动的心实现代码