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

Статті за тегом «Eloquent»

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

No results.
Tips 18 березня 2026

select() - припинити завантаження зайвих колонок

Завантаження повного рядка користувача з 20 колонками. Потрібні тільки ім'я та email.

База даних надсилає всі дані. Пам'ять витрачається. Запит повільніший.

Рішення:

Використовувати select() щоб вказати точні колонки. Швидші запити, менше пам'яті.

Важливо:

Завжди включай первинний ключ (id) щоб зв'язки працювали.

Просунуте:

Використовувати addSelect() щоб додати колонки до існуючого select.

Порада: Особливо важливо для таблиць з TEXT/BLOB колонками або таблиць з 20+ колонками.

// ПОГАНО: Завантажує всі колонки
$users = User::all();
foreach ($users as $user) {
    echo $user->name; // Інші 18 колонок витрачені даремно
}

// ДОБРЕ: Тільки те що потрібно
$users = User::select('id', 'name', 'email')->get();

// Додавати колонки динамічно
$query = User::select('id', 'name');
if ($needEmail) {
    $query->addSelect('email');
}

// Зі зв'язками - потрібні зовнішні ключі
$posts = Post::select('id', 'title', 'user_id')
    ->with('author:id,name')
    ->get();

// Агрегація без завантаження моделей
$totalViews = Post::sum('views');
$avgRating = Post::avg('rating');
$maxPrice = Product::max('price');
Tips 06 березня 2026

value() vs first() - економія пам'яті

Потрібна тільки одна колонка з одного рядка? Не треба завантажувати всю модель.

first() створює повну Eloquent модель. value() повертає тільки дані.

Різниця:

  • first() повертає екземпляр моделі з усіма атрибутами
  • value() повертає одне скалярне значення
  • pluck() повертає колекцію значень з кількох рядків

Коли що використовувати:

Використовувати value() для однієї колонки, одного рядка. Використовувати pluck() для однієї колонки, кількох рядків. Використовувати first() тільки коли потрібні методи моделі.

Порада: На великих таблицях з багатьма колонками value() значно швидший.

// ПОГАНО: Завантажує повну модель з усіма колонками
$email = User::where('id', 1)->first()->email;

// ДОБРЕ: Повертає тільки рядок email
$email = User::where('id', 1)->value('email');

// Декілька рядків, одна колонка
$emails = User::where('active', true)->pluck('email');
// Повертає: Collection ['john@ex.com', 'jane@ex.com']

// Потрібні декілька колонок з кількох рядків?
$users = User::select('id', 'email')->get();

// З ключем за ID
$emails = User::pluck('email', 'id');
// Повертає: [1 => 'john@ex.com', 2 => 'jane@ex.com']
Tips 02 березня 2026

Зупинка проблеми N+1 запитів

Сторінка завантажує 10 постів. База даних робить 101 запит.

1 запит для постів. 100 запитів для авторів. Класична проблема N+1.

Рішення: Eager Loading

Використання with() для завантаження зв'язків наперед. Один запит стає двома.

Порада: Laravel Debugbar показує всі запити. Спочатку встановити його.

Коли НЕ використовувати eager loading:

  • Насправді не потрібні дані зв'язків
  • При роботі з одним записом (немає циклу = немає N+1)
  • Зв'язок повертає величезні набори даних (може бути гірше за N+1)

Просунутий трюк:

Використовувати withCount() коли потрібна тільки кількість, а не повний зв'язок.

// ПОГАНО: 101 запит
$posts = Post::all();
foreach ($posts as $post) {
    echo $post->author->name; // Запит на кожен пост
}

// ДОБРЕ: 2 запити
$posts = Post::with('author')->get();
foreach ($posts as $post) {
    echo $post->author->name; // Без додаткових запитів
}

// Завантажити декілька зв'язків
$posts = Post::with(['author', 'comments', 'tags'])->get();

// Вкладені зв'язки
$posts = Post::with('comments.author')->get();

// Потрібна тільки кількість?
$posts = Post::withCount('comments')->get();
echo $posts[0]->comments_count; // Зв'язок не завантажений