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

Умовне завантаження зв'язків

Потрібні різні зв'язки в залежності від контексту?

Використовуйте when() для умовного eager loading.

Типові кейси:

  • Admin vs звичайний користувач
  • API vs web
  • Різні рівні деталізації

Перевага: одна логіка запиту, різні варіанти відповіді.

// За роллю
$posts = Post::query()
  ->when(auth()->user()->isAdmin(), function ($query) {
    $query->with(['author', 'drafts', 'revisions']);
  })
  ->when(!auth()->user()->isAdmin(), function ($query) {
    $query->with('author:id,name');
  })
  ->get();

// За параметрами запиту
$posts = Post::query()
  ->when(request()->has('include_author'),
    fn($q) => $q->with('author')
  )
  ->when(request()->has('include_comments'),
    fn($q) => $q->with('comments.user')
  )
  ->get();

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

Коментарі

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

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

Інші поради

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'],
]);
Tips 09 вересня 2026

whenEmpty() та whenNotEmpty() - умовні операції

Потрібно виконувати код лише тоді, коли колекція порожня або непорожня? if/else роблять код об'ємним.

whenEmpty() та whenNotEmpty() роблять це чисто.

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

  • Показати контент за замовчуванням
  • Логувати попередження
  • Запускати fallback-логіку
  • Присвоювати значення за замовчуванням

Перевага:

Методи ланцюжаться та зберігають fluent-синтаксис.

Порада: значення, повернуте з callback, стає новим значенням колекції.

10
$users = User::where('active', true)->get();

// ПОГАНО: розривається ланцюжок
if ($users->isEmpty()) {
  return redirect()->back()->with('error', 'No active users');
}

// ДОБРЕ: fluent-синтаксис
$users->whenEmpty(function () {
  return redirect()->back()->with('error', 'No active users');
});

// Додати елементи за замовчуванням, якщо порожньо
$products = Product::where('featured', true)->get();

$products = $products->whenEmpty(function ($collection) {
  return Product::latest()->limit(5)->get();
});

// Логування, якщо непорожня
$errors->whenNotEmpty(function ($collection) {
  Log::error('Validation errors found', $collection->toArray());
});

// З "else"
$users->whenEmpty(
  fn($collection) => ['name' => 'Guest'],
  fn($collection) => $collection->first()
);
Завантаження...