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

whereBetween() - запити по діапазонах

Фільтруєте по діапазону через дві where-умови? Читається важко.

whereBetween() робить те саме, але чистіше.

Кейси:

  • Діапазони дат
  • Фільтр по ціні
  • Вік
  • Будь-які числові інтервали

Є протилежність - whereNotBetween().

// ПОГАНО
$orders = Order::where('total', '>=', 100)
  ->where('total', '<=', 500)
  ->get();

// ДОБРЕ
$orders = Order::whereBetween('total', [100, 500])->get();

// Діапазон дат
$orders = Order::whereBetween('created_at', [
  now()->subDays(30),
  now()
])->get();

// Вік
$users = User::whereBetween('age', [18, 65])->get();

// Виключити діапазон
$products = Product::whereNotBetween('price', [100, 200])->get();

Коментарі

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

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

Інші поради

Tips 07 серпня 2026

upsert() - масовий insert/update

Треба масово вставити або оновити дані?

upsert() робить insert або update у межах одного запиту.

Як працює:

  • Вказуєте унікальні колонки для пошуку
  • Якщо запис існує - оновлюється
  • Якщо ні - вставляється

Порада: ідеально для синхронізації з зовнішніми сервісами.

// Масове оновлення/створення користувачів
User::upsert(
  [
    ['email' => 'john@ex.com', 'name' => 'John', 'age' => 30],
    ['email' => 'jane@ex.com', 'name' => 'Jane', 'age' => 25],
    ['email' => 'bob@ex.com', 'name' => 'Bob', 'age' => 35],
  ],
  ['email'], // Унікальне поле
  ['name', 'age'] // Поля для оновлення
);
Tips 06 серпня 2026

existsOr() та doesntExistOr() - чисті перевірки існування

Спочатку перевіряєте exists(), потім робите дію? Виходить громіздкий if/else.

existsOr() виконає callback, якщо запис не існує. doesntExistOr() - якщо існує.

Де корисно:

  • Кинути виняток
  • Створити запис
  • Залогувати подію
  • Надіслати нотифікацію
// ПОГАНО
if (!User::where('email', $email)->exists()) {
  return response()->json(['error' => 'User not found'], 404);
}

// ДОБРЕ
User::where('email', $email)
  ->existsOr(function () {
    throw new UserNotFoundException('User not found');
  });

// Створити, якщо немає
Post::where('slug', $slug)
  ->existsOr(function () use ($slug) {
    Post::create(['slug' => $slug, 'title' => 'Draft']);
  });

// Лог при існуванні
Order::where('id', $orderId)
  ->where('status', 'pending')
  ->doesntExistOr(function () use ($orderId) {
    Log::warning("Non-pending order: {$orderId}");
  });
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 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 03 серпня 2026

chunkById() - безпечна пакетна обробка

Обробляєте таблицю через chunk() і одночасно змінюєте колонку, за якою фільтруєте? Частина записів буде пропущена.

chunk() гортає сторінки через OFFSET. Якщо запис випадає з вибірки під час обробки, решта зсувається - і цілий пакет ви не побачите.

Як працює chunkById():

Замість OFFSET використовує where('id', '>', $lastId). Зсув вибірки більше не ламає ітерацію.

Коли обов'язково chunkById():

  • Оновлюєте поле, за яким фільтруєте
  • Видаляєте записи під час обходу
  • Будь-яка міграція даних із записом у ту саму таблицю

Порада: сортування задає сам chunkById() - не додавайте власний orderBy(), він його перезапише.

// НЕБЕЗПЕЧНО: пропустить половину записів
User::where('notified', false)
  ->chunk(100, function ($users) {
    foreach ($users as $user) {
      $user->update(['notified' => true]);
      // Вибірка "з'їдається", OFFSET перестрибує записи
    }
  });

// БЕЗПЕЧНО: курсор по первинному ключу
User::where('notified', false)
  ->chunkById(100, function ($users) {
    foreach ($users as $user) {
      $user->update(['notified' => true]);
    }
  });
Завантаження...