Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Tips 04 серпня 2026

Колекції Eloquent - це більше, ніж масиви

Eloquent повертає Collections, а не масиви.

Помилка - одразу викликати toArray() і працювати як з масивом.

Переваги колекцій:

  • Ланцюжки операцій
  • Зручні методи (map, filter, groupBy, pluck...)
  • Більш виразний код

Порада: тримайте дані в Collection якомога довше.

3
$users = User::all(); // Collection

// ПОГАНО
foreach ($users->toArray() as $user) {
  echo $user['name'];
}

// ДОБРЕ
$users->each(function ($user) {
  echo $user->name;
});

// Фільтрація й трансформація
$activeAdmins = $users
  ->where('active', true)
  ->where('is_admin', true)
  ->pluck('email');

// Групування
$byRole = $users->groupBy('role');

// Пара "id => name"
$names = $users->pluck('name', 'id');

// Перевірка
$hasAdmin = $users->contains('is_admin', true);
$hasAdult = $users->contains(fn($user) => $user->age > 18);

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Інші поради

Tips 21 вересня 2026

zip() і combine() - зшивання колекцій

Маєте два окремі масиви - заголовки й значення? Або назви колонок і рядок CSV?

Зшивати їх циклом по індексу не потрібно.

Різниця:

  • zip() - склеює елементи попарно, повертає колекцію пар
  • combine() - бере першу колекцію як ключі, другу як значення

Де корисно:

  • Парсинг CSV: рядок заголовків + рядки даних
  • Зіставлення результатів двох запитів
  • Побудова асоціативних структур на льоту

Порада: zip() не обрізає до найкоротшої колекції - відсутні значення стають null.

// combine() - ключі + значення
$headers = collect(['name', 'email', 'age']);
$row = ['John', 'john@ex.com', 30];

$user = $headers->combine($row);
// ['name' => 'John', 'email' => 'john@ex.com', 'age' => 30]

// zip() - попарне склеювання
$names = collect(['John', 'Jane']);
$ages = [30, 25];

$pairs = $names->zip($ages);
// [['John', 30], ['Jane', 25]]

// zip() з нерівною довжиною - null у хвості
collect([1, 2, 3])->zip([10, 20]);
// [[1, 10], [2, 20], [3, null]]

// Кілька колекцій одночасно
$names->zip($ages, $emails);
// [['John', 30, 'john@ex.com'], ...]
Tips 18 вересня 2026

skip() і take() - пагінація без БД

Потрібна пагінація на клієнтській стороні або на вже завантажених даних?

skip() і take() працюють як OFFSET і LIMIT.

Використання:

  • In-memory пагінація
  • Розбиття результатів
  • API-слайси

Комбінація:

Використовуються разом.

Порада: forPage() - короткий шлях для skip/take.

$items = collect(range(1, 100));

// Пропустити 20, взяти 10
$page = $items->skip(20)->take(10);
// [21, 22, ..., 30]

// Пагінація вручну
$perPage = 10;
$page = 3;

$results = $items->skip(($page - 1) * $perPage)
  ->take($perPage);

// Коротко: forPage()
$results = $items->forPage(3, 10);

// Умовні варіанти замість числа
$items->skipUntil(fn($i) => $i > 50);
$items->skipWhile(fn($i) => $i < 20);
$items->takeUntil(fn($i) => $i > 50);
$items->takeWhile(fn($i) => $i < 20);
Tips 16 вересня 2026

sliding() - Створення "ковзних вікон"

Потрібні перекривні чанки? Наприклад, для ковзного середнього?

sliding() створює ковзні вікна по колекції.

Використання:

  • Ковзні середні
  • Аналіз трендів
  • Пошук патернів
  • Послідовний аналіз

Параметри:

  • Розмір вікна
  • Крок (за замовчуванням 1)

Порада: підходить для аналізу часових рядів.

$numbers = collect([1, 2, 3, 4, 5, 6]);

// Розмір 3, крок 1
$windows = $numbers->sliding(3);
// [[1,2,3], [2,3,4], [3,4,5], [4,5,6]]

// Розмір 3, крок 2
$windows = $numbers->sliding(3, 2);
// [[1,2,3], [3,4,5]]

// Ковзне середнє
$values = collect([10, 20, 30, 40, 50]);

$movingAvg = $values->sliding(3)
  ->map(fn($window) => $window->avg());
// [20, 30, 40]
Tips 14 вересня 2026

collapse() - Сплющення вкладених колекцій

Маєте масив масивів? Потрібен один суцільний?

collapse() сплющує лише один рівень.

Приклади використання:

  • Об'єднання кількох колекцій
  • Сплющення згрупованих даних
  • Комбінування результатів запитів

Відмінність від flatten():

  • collapse() - один рівень
  • flatten() - рекурсивно всі рівні

Порада: використовуйте flatten() для глибоко вкладених структур.

// Масив масивів
$data = collect([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
]);

$flat = $data->collapse();
// [1, 2, 3, 4, 5, 6, 7, 8, 9]

// Колекції у колекції
$tags = collect([
  collect(['php', 'laravel']),
  collect(['javascript', 'vue']),
  collect(['mysql', 'redis']),
]);

$allTags = $tags->collapse();
// ['php', 'laravel', 'javascript', 'vue', 'mysql', 'redis']

// Приклад: об'єднання дозволів користувача з ролей
$user->roles->map(fn($role) => $role->permissions)->collapse();

// Групування, а потім collapse
$orders = Order::all()
  ->groupBy('user_id')
  ->map(fn($userOrders) => $userOrders->pluck('items'))
  ->collapse();
Tips 11 вересня 2026

sortBy() з кількома колонками

Потрібно сортувати за кількома полями? Подібно до ORDER BY у SQL.

sortBy() приймає масив пар "колонка/напрям".

Синтаксис:

Масив масивів: [column, direction].

Напрям:

asc або desc.

Порада: використовуйте sortByDesc() для одного поля зі спаданням.

$users = collect([
  ['name' => 'John', 'age' => 30, 'city' => 'NYC'],
  ['name' => 'Jane', 'age' => 25, 'city' => 'LA'],
  ['name' => 'Bob', 'age' => 30, 'city' => 'SF'],
]);

// Сортування за віком, потім за ім'ям
$sorted = $users->sortBy([
  ['age', 'asc'],
  ['name', 'asc'],
]);

// За містом спаданням, далі за віком
$sorted = $users->sortBy([
  ['city', 'desc'],
  ['age', 'asc'],
]);

// З callback
$sorted = $users->sortBy([
  [fn($user) => $user['age'], 'desc'],
  ['name', 'asc'],
]);

// Еloquent-колекції
$posts = Post::all()->sortBy([
  ['featured', 'desc'],
  ['published_at', 'desc'],
]);
Завантаження...