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

Summer__發表於2019-09-04

Laravel

文章轉自:learnku.com/laravel/t/2…

Laravel Eloquent 通常返回一個集合作為結果,集合包含很多有用的、功能強大的方法。你可以很方便的對集合進行過濾、修改等操作。本次教程就一起來看一看集合的常用方法及功能。 集合並不僅限於 eloquent ,也可以單獨使用。但 Eloquent 的結果就是一個集合。你可以使用助手函式 collect 將陣列轉化為集合。下面所列出的集合的方法適用於 eloquent 結果的同時也適用於集合本身。

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

$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 集合上使用輔助方法時,不會再查詢資料庫。 我們首先要從資料庫中獲取所有結果,然後我們使用集合方法來過濾和修改它們,而無需查詢資料庫。

filter()

filter,最有用的 laravel 集合方法之一,允許您使用回撥過濾集合。 它只傳遞那些返回true的項。 所有其他專案都被刪除。 filter 返回一個新例項而不更改原始例項。 它接受 valuekey 作為回撥中的兩個引數。

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

$filter->all();
複製程式碼

all 方法返回底層陣列。 上面的程式碼返回以下響應。

[
    1 => [
        "user_id" => 2,
        "title" => "Testing in Laravel",
        "content" => "Testing File Uploads in Laravel",
        "category" => "php"
    ]
]
複製程式碼

search()

search 方法可以用給定的值查詢集合。如果這個值在集合中,會返回對應的鍵。如果沒有資料項匹配對應的值,會返回 false

$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 集合方法在您自己的專案中處理集合。

文章轉自:learnku.com/laravel/t/2…
更多文章:learnku.com/laravel/c/t…

相關文章