15 самых важных методов коллекций Laravel: обзор и примеры
Методы коллекций Laravel позволяют эффективно работать с данными и выполнять различные операции с коллекциями. В статье представлены 15 ключевых методов, которые помогут улучшить ваш код и сделать его более читаемым и производительным.
Вы узнаете, как использовать такие методы, как map, filter и reduce, чтобы значительно упростить обработку данных в Laravel. Эти методы помогут вам работать с массивами и коллекциями намного быстрее и удобнее.
Введение
В этой статье мы рассмотрим несколько самых полезных и нужных методов коллекций Laravel, которые значительно упрощают процесс разработки.
Примечание: не забудьте, что коллекции Eloquent наследуют класс (и методы) базовой коллекции Laravel, однако при этом базовая коллекция не имеет доступа к методам коллекции Eloquent.
Посмотрим, как создать простой объект базовой коллекции Laravel:
$todocollection = collect([
[
'user_id' => '1',
'title' => ‘Do Laundry,
‘description => ‘I ‘have to do laundry ‘
],
[
'user_id' => '1',
'title' => ‘Finish Assignment,
‘description => ‘I have to finish Maths assignment ‘
],
]);
Вот так и создаются объекты коллекций в Laravel. Теперь вам доступны все мощные методы коллекций Laravel.
Посмотрим на пример объекта из коллекции Eloquent:
$todos = ToDo::where('user_id',1)->get();Здесь $todos – один из объектов коллекции Eloquent, который содержит результаты запроса. По сути, он представляет собой массив в сочетании с набором инструментов для операций над данными. По сравнению с базовой коллекцией Laravel, коллекция Eloquent предоставляет расширенный набор методов, среди которых – преобразование коллекции в массив, поиск, сортировка, фильтрация, объединение и так далее.
Давайте рассмотрим самые нужные и полезные методы для работы с коллекциями Laravel.
all()
Класс коллекций Laravel имеет защищенное свойство $items, которое содержит массив со всеми данными. Оболочка коллекции предусматривает методы манипулирования массивом. Но если вам нужно просто получить все элементы коллекции в виде массива, пригодится как раз этот метод.
$emails = collect([
‘abc@gmail.com,
‘user@yahoo.com’,
‘example@example.com’,
‘test@yahoo.co.in’
]);
$emails_array = $emails->all();
dd($emails_array);
/*
Array:4 [▼
0 => "‘abc@gmail.com"
1 => "user@yahoo.com"
2 => "example@example.com’"
3 => “test@yahoo.co.in”
]
*/avg()
Этот метод возвращает среднее арифметическое всех значений в коллекции. По умолчанию среднее значение вычисляется на основе всех элементов. Но если коллекция содержит пары ключ => значение, можно подставить ключ в функцию – тогда она будет автоматически вычислять среднее арифметическое значений, относящихся к указанному ключу.
$simple_collection = collect([2,5,7,35,25,10]);
$s_avg = $simplex_collection->avg();
// 14
$key_collection = collect(['score' => 98], ['score' => 90], ['score' => 70],['score' => 86]);
$key_avg = $key_collection->avg();
//86
each()
Метод each() в коллекции Laravel очень похож на функцию перебора массива в PHP и JavaScript. Данный метод осуществляет перебор массива на основе callback-функции, поэтому его можно использовать для операций над каждым отдельным элементом – например, для изменения значений.
$collection = collect([1,2,3,4]);
$collection->each(function($item){
return $item*$item;
});
// [1,4,9,16]
chunk()
Этот метод используют для разделения коллекции Laravel на множество мелких коллекций заданного размера.
$users = User::all();
$userschunk = $users->chunk(2);
dd($userschunk->toArray());
array:3 [▼
0 => array:2 [▼
0 => array:3 [▼
"id" => 1
"name" => "John Doe"
"email" => "johndoe@example.com"
]
1 => array:3 [▼
"id" => 2
"name" => "Jack Halt"
"email" => "jhalt@example.com"
]
]
1 => array:1 [▼
2 => array:3 [▼
"id" => 3
"name" => "Sam Pitt"
"email" => "spitt@example.com"
]
]
]
Также советую почитать:
Урок по Laravel 8 для начинающих: создаем первое приложение.
contains()
Часто требуется проверить, содержит ли коллекция какое-либо значение или нет. Коллекция Laravel предоставляет простой метод для этого – contains().
Данный метод проверяет коллекцию на наличие определенного значения; возвращает логическое выражение true в случае наличия, false в случае отсутствия.
$users = collect(['name' => 'John Doe', 'email' => "johndoe@example.com"]);
$users->contains('johndoe@example.com');
// true
$users->contains('spitt@example.com');
// false
Этот метод также позволяет проверять коллекцию на наличие пар, состоящих из заданного ключа и значения:
$users = collect(['name' => 'John Doe', 'email' => "johndoe@example.com"]);
$users->contains('email', 'johndoe@example.com');
// true
$users->contains('name', 'johndoe@example.com');
// false
Можно использовать callback-функцию с заданными условиями, чтобы выяснить, имеется ли в коллекции нужное значение или нет.
$collection = collect([11, 25, 30, 45, 50]);
$collection->contains(function ($value, $key) {
return $value == 55;
});
// false
Метод contains() проверяет коллекцию только на наличие значений. Есть еще один, более строгий метод containsStrict() – он также использует сравнение типа данных.
count() и countBy()
Очень простые, но полезные методы для подсчета количества элементов в коллекциях Laravel. Метод count() возвращает общее количество элементов в коллекции.
$collection = collect([10,20,30,40,50]);
$collection->count();
// 5
В свою очередь, метод countBy(), подсчитывает количество вхождений определенного значения в массиве данных.
$numbercollection = collect([10, 30,30, 50, 50]);
$counts = $numbercollection->countBy();
$counts->all();
// [10 => 1, 30 => 2, 50 => 2]
filter()
Один из самых популярных и практичных методов. Он фильтрует коллекцию и в новом массиве возвращает элементы, соответствующие заданному условию, при этом оригинальная коллекция остается неизменной. Для указания условий фильтрации callback-функция предусматривает использование ключа и значения.
$users = collect(['name' => 'John Doe', 'email' => "johndoe@example.com"]);
$filter = $users->filter(function($value, $key) {
if ($value['email'] == "johndoe@example.com") {
return true;
}
});
$filter->all();
/*
[
1 =>[
'name' => 'John Doe',
'email' => "johndoe@example.com"
]
]
*/
Если вы не используете callback-функцию, данный метод проигнорирует все элементы со значением, эквивалентным false – null, false, “, 0, []. Таким образом, это самый простой способ отбросить все пустые элементы коллекции.
get()
Данный метод возвращает элемент коллекции по переданному ключу. Если ключ не задан, возвращается null.
$users = collect(['name' => 'John Doe', 'email' => "johndoe@example.com"]);
$value = $users->get('name');
// John Doe
search()
Очень простой и нужный метод. Он проводит поиск заданного значения среди элементов коллекции и возвращает ключ элемента, если значение было найдено, и false, если значение не было обнаружено.
$numbers = collect([31,21,53,64,27]);
$numbers->search(27);
// 4
groupBy()
Данный метод группирует элементы по переданному ключу; работает так же, как groupBy в коллекции Eloquent. Способ группировки данных по определенному ключу используют довольно часто – обычно на уровне запросов к базе данных. Однако на практике также часто требуется группировка элементов в коллекции.
$orders = collect([
['product_id' => 'p10', 'email' => 'jdoe@example.com'],
['product_id' => 'p10', 'email' => 'billy@example.com'],
['product_id' => 'p11', 'email' => 'danny@example.com'],
]);
$grouped = $orders->groupBy('product_id');
$grouped->toArray();
/*
[
'p10' => [
['product_id' => 'p10', 'email' => 'jdoe@example.com'],
['product_id' => 'p10', 'email' => 'billy@example.com'],
],
'p11' => [
['product_id' => 'p11', 'email' => 'danny@example.com'],
],
]
*/
max()
Вам наверняка приходилось использовать эту функцию в Excel для нахождения максимального значения в столбце или строке. Точно так же max()работает в коллекциях Laravel, возвращая максимальное значение среди элементов.
$counter = collect([['count' => 10], ['count' => 20]]);
$counter->max('count');
// 20
Если вы не передаете функции никаких ключей, данный метод последовательно сравнит все элементы в коллекции и вернет максимальный.
pluck()
Один из моих самых любимых методов для работы с базовыми коллекциями Laravel и Eloquent – pluck(). Он извлекает из коллекции все значения элементов по заданному ключу.
$users = collect([
['name' => 'John Doe', 'email' => "johndoe@example.com"],
['name' => 'Jack Sparrow', 'email' => "sparrow@example.com"]
]);
$emails = $users->pluck('email');
/*
["johndoe@example.com","sparrow@example.com"]
*/
forget()
Данный метод удаляет элемент коллекции по заданному ключу.
$users = collect(['name' => 'John Doe', 'email' => 'johndoe@example.com']);
$users->forget('name');
$users->all();
// ['email' => 'johndoe@example.com']
toArray()
Самый простой способ преобразования Laravel коллекции в обычный PHP-массив.
$users = collect(['name' => 'John Doe', 'email' => 'johndoe@example.com']);
$users->toArray();
/*
[
['name' => 'John Doe', 'email' => 'johndoe@example.com'],
]
*/
sortBy()
С помощью этого метода можно отсортировать коллекцию по переданному ключу. Оригинальный ключ при этом сохраняется – элементы просто сортируются в соответствии с заданным условием.
$products = collect([
['name' => 'Laptop', 'price' => 2000],
['name' => 'Mouse', 'price' => 100],
['name' => 'Keyboard', 'price' => 150],
]);
$sortedproducts = $products->sortBy('price');
/*
[
['name' => 'Mouse', 'price' => 100],
['name' => 'Keyboard', 'price' => 150],
['name' => 'Laptop', 'price' => 2000],
]
*/
Для более сложной сортировки можно использовать callback-функцию в качестве аргумента.
Вкратце, это самые важные методы, которые необходимо знать каждому Laravel-разработчику. Есть множество других методов для работы с коллекциями Laravel, ознакомиться с ними можно в официальной документации.
Комментарии