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

Tips & Tricks: статті за тегом «Eloquent»

Статті, новини, туторіали та переклади від учасників спільноти

No results.
Tips 12 серпня 2026

withDefault() - ніяких null при зв'язках

Постійно перевіряєте, чи існує зв'язок, перед доступом до нього?

withDefault() повертає "порожню" модель замість null.

Переваги:

  • Менше if ($user->profile)
  • Чистіші Blade-шаблони
  • Можливість задати дефолтні значення
4
// User model
public function profile()
{
  return $this->hasOne(Profile::class)
    ->withDefault([
      'bio' => 'No bio provided',
      'avatar' => 'default.png',
      'website' => null,
    ]);
}

// Без перевірок на null
{{ $user->profile->bio }}
// Динамічні дефолти
public function profile()
{
  return $this->hasOne(Profile::class)
    ->withDefault(function ($profile, $user) {
      $profile->bio = "Member since {$user->created_at->year}";
    });
}

// BelongsTo з дефолтом
public function author()
{
  return $this->belongsTo(User::class, 'author_id')
    ->withDefault([
      'name' => 'Guest',
      'email' => 'noreply@example.com',
    ]);
}

// У Blade
{{ $post->author->name }} // Ніколи не null
Tips 10 серпня 2026

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

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

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

Кейси:

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

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

4
// ПОГАНО
$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);
Завантаження...

Матеріали за темою «Eloquent»: усе, що ми писали про це українською. Нижче - суміжні теми, якщо шукаєте ширше.

Зараз опубліковано 30 матеріалів від 3 авторів. Останній матеріал - 12 серпня 2026.