Любая выборка, построенная с помощью языка запросов или связей, это объект, который позволяет получить выбранные данные через метод get()
. Сами данные при этом ведут себя как массив объектов, но в реальности не являются массивом:
>>> $users = App\Models\User::where('id', '>', 1)->get()
=> Illuminate\Database\Eloquent\Collection {#2399}
>>> $posts = App\Models\User::find(1)->posts()->get();
=> Illuminate\Database\Eloquent\Collection {#2396}
Вместо массива Eloquent возвращает экземпляр Illuminate\Database\Eloquent\Collection. Это класс, расширяющий другой класс, Collection, созданный для упрощения обработки наборов данных. Он содержит внутри себя десятки удобных методов, с помощью которых данные можно фильтровать, сортировать, агрегировать и так далее.
<?php
// Сразу возвращает Collection
$users = App\Models\User::all();
// Такую операцию правильно делать напрямую в базе данных
// Здесь она только для демонстрации
$names = $users->filter(function ($user) { // фильтруем
return $user->active === true;
})
->map(function ($user) { // отображаем
return $user->name;
});
В результате работы этого кода, внутри $names
останутся имена активных пользователей.
Ниже посмотрим на некоторые полезные методы, которые могут пригодиться в повседневной работе:
<?php
$users = App\Models\User::all();
// contains – проверяет, содержит ли коллекция объект с указанным идентификатором (id)
$users->contains(1); // true
$users->contains(3); // false
// unique – возвращает уникальные объекты
$users = $users->unique();
// modelKeys – возвращает список первичных ключей
$users->modelKeys();
// intersect – возвращает пересечение между двумя коллекциями
$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());
// diff – возвращает разницу между двумя коллекциями
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());
Это только верхушка айсберга. Более подробно нужно смотреть в официальной документации. Библиотека Collections относится к такому типу библиотек, в которые нужно постоянно заглядывать и изучать её возможности. В любом случае, её использование значительно сокращает количество кода и делает код качественнее.
Однако, с ней легко увлечься. Эта библиотека работает с коллекциями в памяти. То есть сначала данные выгружаются из базы и затем над ними производятся нужные преобразования. Если данных много, то приложение начнет потреблять очень много памяти и станет работать медленнее. Поэтому, все операции фильтрации, группировки и сортировки, которые можно выполнить прямо в базе данных, нужно делать в базе данных. Коллекции в памяти должны быть небольшими.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.