15 самых важных методов коллекций Laravel: обзор и примеры

Фреймворк Laravel включает в себя очень мощный и удобный инструмент для работы с массивами. Если вам приходилось работать с моделями Eloquent, вы уже сталкивались с массивами – Eloquent возвращает результаты запроса в пользовательском объекте коллекции.

Все коллекции Eloquent наследуют класс коллекций Laravel. По этой причине они также наследуют все методы, предоставляемые базовым классом коллекций 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, ознакомиться с ними можно в официальной документации.

Данная публикация является переводом статьи «15 Must know Laravel Collection Methods ~ Laravel Collections Tutorial» , подготовленная редакцией проекта.

Меню