Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

Любая выборка построенная с помощью языка запросов или связей, это объект, который позволяет получить выбранные данные через метод get(). Сами данные при этом, ведут себя как массив объектов, но, в реальности, не являются массивом:

>>> $users = \App\User::where('id', '>', 1)->get()
=> Illuminate\Database\Eloquent\Collection {#2399}

>>> $posts = \App\User::find(1)->posts()->get();
=> Illuminate\Database\Eloquent\Collection {#2396}

Вместо массива Eloquent возвращает инстанс Illuminate\Database\Eloquent\Collection. Это класс, расширяющий другой класс, Collection, созданный для упрощения обработки наборов данных. Он содержит внутри себя десятки удобных методов, с помощью которых данные можно фильтровать, сортировать, агрегировать и так далее.

<?php

// Сразу возвращает Collection
$users = App\User::all();

// Такую операцию правильно делать напрямую в базе данных
// Здесь она только для демонстрации
$names = $users->filter(function ($user) { // фильтруем
    return $user->active === true;
})
->map(function ($user) { // отображаем
    return $user->name;
});

В результате работы этого кода, внутри $names останутся имена активных пользователей.

Ниже посмотрим на некоторые полезные методы, которые могут пригодиться в повседневной работе:

<?php
$users = \App\User::all();

// contains – проверяет содержит ли коллекция объект с указанным идентификатором (id)
$users->contains(1); // true
$users->contains(3); // false

// unique – возвращает уникальные объекты
$users = $users->unique();

// modelKeys – возвращает список первичных ключей
$users->modelKeys();

// modelKeys – возвращает список первичных ключей

// intersect – возвращает пересечение между двумя коллекциями
$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());

// diff – возвращает разницу между двумя коллекциями
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());

Это только верхушка айсберга. Более подробно нужно смотреть в официальной документации. Библиотека Collections относится к такому тиму библиотек. В которые нужно постоянно заглядывать и изучать ее возможности. В любом случае, ее использование, значительно сокращает количество кода и делает код качественее. Но будьте осторожны. Те операции которые можно выполнять в базе, нужно выполнять в базе. Работа с большими коллекциями в памяти жестко бьет по производительности и ест ресурсы.


Дополнительные материалы

  1. Коллекции в Laravel
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →