十五個經常使用的 Laravel 集合(Collection)

Laravel

文章轉自: https://learnku.com/laravel/t...

Laravel Eloquent 一般返回一個集合做爲結果,集合包含不少有用的、功能強大的方法。你能夠很方便的對集合進行過濾、修改等操做。本次教程就一塊兒來看一看集合的經常使用方法及功能。
集合並不只限於 eloquent ,也能夠單獨使用。但 Eloquent 的結果就是一個集合。你可使用助手函數 collect 將數組轉化爲集合。下面所列出的集合的方法適用於 eloquent 結果的同時也適用於集合自己。php

比方說,你有一個帖子模型。 你找到全部 php 類別的帖子。laravel

$posts = App\Post::where('category', 'php')->get();

上面的命令返回一個集合。 集合是一個laravel類,它在內部使用數組函數併爲它們添加許多功能。數據庫

你能夠簡單的使用 collect 方法建立一個集合,以下:數組

$collection = collect([
    [
        'user_id' => '1',
        'title' => 'Helpers in Laravel',
        'content' => 'Create custom helpers in Laravel',
        'category' => 'php'
    ],
    [
        'user_id' => '2',
        'title' => 'Testing in Laravel',
        'content' => 'Testing File Uploads in Laravel',
        'category' => 'php'
    ],
    [
        'user_id' => '3',
        'title' => 'Telegram Bot',
        'content' => 'Crypto Telegram Bot in Laravel',
        'category' => 'php'
    ],
]);

上面的數組其實是 Post 模型的值。 在本教程中,咱們將使用此數組進行簡化。 請記住,一切都將以一樣的方式基於 eloquent。函數

當咱們在 eloquent 集合上使用輔助方法時,不會再查詢數據庫。 咱們首先要從數據庫中獲取全部結果,而後咱們使用集合方法來過濾和修改它們,而無需查詢數據庫。post

filter()

filter,最有用的 laravel 集合方法之一,容許您使用回調過濾集合。 它只傳遞那些返回true的項。 全部其餘項目都被刪除。 filter 返回一個新實例而不更改原始實例。 它接受 valuekey 做爲回調中的兩個參數。測試

$filter = $collection->filter(function($value, $key) {
    if ($value['user_id'] == 2) {
        return true;
    }
});

$filter->all();

all 方法返回底層數組。 上面的代碼返回如下響應。spa

[
    1 => [
        "user_id" => 2,
        "title" => "Testing in Laravel",
        "content" => "Testing File Uploads in Laravel",
        "category" => "php"
    ]
]

search()

search 方法能夠用給定的值查找集合。若是這個值在集合中,會返回對應的鍵。若是沒有數據項匹配對應的值,會返回 false3d

$names = collect(['Alex', 'John', 'Jason', 'Martyn', 'Hanlin']);

$names->search('Jason');

// 2

search 方法默認使用鬆散比較。你能夠在它的第二個參數傳 true 使用嚴格比較。調試

你也能夠傳你本身的回調函數到 search 方法中。將返回經過回調真值測試的第一個項的鍵。

$names = collect(['Alex', 'John', 'Jason', 'Martyn', 'Hanlin']);

$names->search(function($value, $key) {
    return strlen($value) == 6;
});

// 3

chunk()

chunk 方法將集合分割爲多個給定大小的較小集合。將集合顯示到網格中很是有用。

$prices = collect([18, 23, 65, 36, 97, 43, 81]);

$prices = $prices->chunk(3);

$prices->toArray();

以上代碼生成效果。

[
    0 => [
        0 => 18,
        1 => 23,
        2 => 65
    ],
    1 => [
        3 => 36,
        4 => 97,
        5 => 43
    ],
    2 => [
        6 => 81
    ]
]

dump()

dump 打印集合的方法。 它可用於在任何位置的調試和查找集合內的內容。

$collection->whereIn('user_id', [1, 2])
    ->dump()
    ->where('user_id', 1);

dump 上述代碼結果。

Laravel

map()

map 方法用於遍歷整個集合。 它接受回調做爲參數。 valuekey 被傳遞給回調。 回調能夠修改值並返回它們。 最後,返回修改項的新集合實例。

$changed = $collection->map(function ($value, $key) {
    $value['user_id'] += 1;
    return $value;
});

return $changed->all();

基本上,它將 user_id 增長1。

上面代碼的響應以下所示。

[
    [
        "user_id" => 2,
        "title" => "Helpers in Laravel",
        "content" => "Create custom helpers in Laravel",
        "category" => "php"
    ],
    [
        "user_id" => 3,
        "title" => "Testing in Laravel",
        "content" => "Testing File Uploads in Laravel",
        "category" => "php"
    ],
    [
        "user_id" => 4,
        "title" => "Telegram Bot",
        "content" => "Crypto Telegram Bot in Laravel",
        "category" => "php"
    ]
];

zip()

Zip 方法會將給定數組的值與集合的值合併在一塊兒。相同索引的值會添加在一塊兒,這意味着,數組的第一個值會與集合的第一個值合併。在這裏,我會使用咱們在上面剛剛建立的集合。這對 Eloquent 集合一樣有效。

$zipped = $collection->zip([1, 2, 3]);

$zipped->all();

JSON 響應會像這樣。

Laravel

因此,基本上就是這樣。若是數組的長度小於集合的長度,Laravel 會給剩下的 Collection 類型的元素末尾添加 null。相似地,若是數組的長度比集合的長度大,Laravel 會給 Collection 類型的元素添加 null,而後再接着數組的值。

whereNotIn()

您可使用 whereNotIn 方法簡單地按照給定數組中未包含的鍵值過濾集合。 它基本上與 whereIn 相反。 此外,此方法在匹配值時使用寬鬆比較 ==

讓咱們過濾 $collection,其中 user_id 既不是 1 也不是 2的。

$collection->whereNotIn('user_id', [1, 2]);

上面的語句將只返回 $collection 中的最後一項。 第一個參數是鍵,第二個參數是值數組。 若是是 eloquent 的話,第一個參數將是列的名稱,第二個參數將是一個值數組。

max()

max 方法返回給定鍵的最大值。 你能夠經過調用max來找到最大的 user_id。 它一般用於價格或任何其餘數字之類的比較,但爲了演示,咱們使用 user_id。 它也能夠用於字符串,在這種狀況下,Z> a

$collection->max('user_id');

上面的語句將返回最大的 user_id,在咱們的例子中是 3

pluck()

pluck 方法返回指定鍵的全部值。 它對於提取一列的值頗有用。

$title = $collection->pluck('title');
$title->all();

結果看起來像這樣。

[
  "Helpers in Laravel",
  "Testing in Laravel",
  "Telegram Bot"
]

When working with eloquent, you can pass a column name as an argument to extract its values. pluck also accepts a second argument and in the case of eloquent collections, it can be another column name. It will result in collection keyed by the values of the second argument.
使用 eloquent 時,能夠將列名做爲參數傳遞以提取值。 pluck 也接受第二個參數,對於 eloquent 的集合,它能夠是另外一個列名。 它將致使由第二個參數的值做爲鍵的集合。

$title = $collection->pluck('user_id', 'title');
$title->all();

結果以下:

[
    "Helpers in Laravel" => 1,
    "Testing in Laravel" => 2,
    "Telegram Bot" => 3
]

each()

each 是一種迭代整個集合的簡單方法。 它接受一個帶有兩個參數的回調:它正在迭代的項和鍵。 Key 是基於 0 的索引。

$collection->each(function ($item, $key) {
    info($item['user_id']);
});

上面代碼,只是記錄每一個項的 user_id

在迭代 eloquent 集合時,您能夠將全部列值做爲項屬性進行訪問。 如下是咱們如何迭代全部帖子。

$posts = App\Post::all();

$posts->each(function ($item, $key) {
    // Do something
});

若是回調中返回 false,它將中止迭代項目。

$collection->each(function ($item, $key) {
    // Tasks
    if ($key == 1) {
        return false;
    }
});

tap()

tap() 方法容許你隨時加入集合。 它接受回調並傳遞並將集合傳遞給它。 您能夠對項目執行任何操做,而無需更改集合自己。 所以,您能夠在任什麼時候候使用tap來加入集合,而不會改變集合。

$collection->whereNotIn('user_id', 3)
    ->tap(function ($collection) {
        $collection = $collection->where('user_id', 1);
        info($collection->values());
    })
    ->all();

在上面使用的 tap 方法中,咱們修改了集合,而後記錄了值。 您能夠對 tap 中的集合作任何您想作的事情。 上面命令的響應是:

[
    [
        "user_id" => "1",
        "title" => "Helpers in Laravel",
        "content" => "Create custom helpers in Laravel",
        "category" => "php"
    ],
    [
        "user_id" => "2",
        "title" => "Testing in Laravel",
        "content" => "Testing File Uploads in Laravel",
        "category" => "php"
    ]
]

你能夠看到 tap 不會修改集合實例。

pipe()

pipe 方法很是相似於 tap 方法,由於它們都在集合管道中使用。 pipe 方法將集合傳遞給回調並返回結果。

$collection->pipe(function($collection) {
    return $collection->min('user_id');
});

上述命令的響應是 1。 若是從 pipe 回調中返回集合實例,也能夠連接其餘方法。

contains()

contains 方法只檢查集合是否包含給定值。 只傳遞一個參數時纔會出現這種狀況。

$contains = collect(['country' => 'USA', 'state' => 'NY']);

$contains->contains('USA');
// true

$contains->contains('UK');
// false

若是將 鍵 / 值 對傳遞給 contains 方法,它將檢查給定的鍵值對是否存在。

$collection->contains('user_id', '1');
// true

$collection->contains('title', 'Not Found Title');
// false

您還能夠將回調做爲參數傳遞給回調方法。 將對集合中的每一個項目運行回調,若是其中任何一個項目經過了真值測試,它將返回 true 不然返回 false

$collection->contains(function ($value, $key) {
    return strlen($value['title']) < 13;
});
// true

回調函數接受當前迭代項和鍵的兩個參數值。 這裏咱們只是檢查標題的長度是否小於13。在 Telegram Bot 中它是12,因此它返回 true

forget()

forget 只是從集合中刪除該項。 您只需傳遞一個鍵,它就會從集合中刪除該項目。

$forget = collect(['country' => 'usa', 'state' => 'ny']);

$forget->forget('country')->all();

上面代碼響應以下:

[
    "state" => "ny"
]

forget 不適用於多維數組。

avg()

avg 方法返回平均值。 你只需傳遞一個鍵做爲參數,avg 方法返回平均值。 你也可使用 average 方法,它基本上是 avg 的別名。

$avg = collect([
    ['shoes' => 10],
    ['shoes' => 35],
    ['shoes' => 7],
    ['shoes' => 68],
])->avg('shoes');

上面的代碼返回 30 ,這是全部四個數字的平均值。 若是你沒有將任何鍵傳遞給avg 方法而且全部項都是數字,它將返回全部數字的平均值。 若是鍵未做爲參數傳遞且集合包含鍵/值對,則 avg 方法返回 0。

$avg = collect([12, 32, 54, 92, 37]);

$avg->avg();

上面的代碼返回 45.4,這是全部五個數字的平均值。

您可使用這些 laravel 集合方法在您本身的項目中處理集合。

文章轉自: https://learnku.com/laravel/t...

更多文章: https://learnku.com/laravel/c...
相關文章
相關標籤/搜索