日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

优雅使用 illuminate/database 包中的 Collection

發布時間:2023/12/13 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 优雅使用 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。