Laravel красивый, но жрёт ресурсы как не в себя, если писать говнокод. Eloquent превращает простую выборку в карнавал запросов, Blade — в тормознутый шаблонизатор с логикой уровня бизнес-правил. Давай разберём, где всё ломается и что делать, чтобы не превратить проект в печку для сжигания серверных ядер.

Eloquent: красиво, но медленно, если не думать

1. N+1 — классика жанра

Самый популярный способ положить базу. Ты берёшь список пользователей, а для каждого дергаешь ещё и профиль. В итоге вместо одного запроса у тебя сотня.

// Плохо — N+1 $users = User::all();
foreach ($users as $user) {
    echo $user->profile->name;
}

// Хорошо — eager loading $users = User::with('profile')->get();
foreach ($users as $user) {
    echo $user->profile->name;
}

Без with() база умирает медленно и мучительно.

2. Query Builder вместо «магии»

Eloquent крут, пока запросы простые. Но как только начинается «пять джойнов и фильтр по подзапросу» — ORM рожает монстра.

$users = DB::table('users')
    ->join('profiles', 'users.id', '=', 'profiles.user_id')
    ->select('users.*', 'profiles.name')
    ->get();

Да, выглядит скучно, но работает быстрее и без сюрпризов.

3. Кэшируй или умри

Если у тебя админка каждый раз грузит список пользователей с фильтрацией, ты сам себе враг. Вынеси это в кэш.

$users = Cache::remember('users', 60, fn () => User::all());

Секунда экономии на каждом запросе превращается в часы экономии серверного времени.

Blade: не превращай шаблон в контроллер

1. Компоненты вместо копипаста

Вместо того чтобы копировать 20 строк для юзера везде, сделай компонент:

<x-user :user="$user" />

Менять код потом будешь в одном месте, а не бегать по всем шаблонам.

2. Не лепи логику в шаблон

Blade позволяет написать хоть SQL прямо в фигурных скобках, но ты же не идиот.

{{-- Плохо --}}
{{ $user->posts->count() }}

3. @once — но осторожно

Полезная директива, чтобы не дублировать куски. Но если начинаешь городить в ней счётчики и бизнес-логику — значит, делаешь что-то не там.

@once
    @php $total = 0; @endphp
@endonce

@foreach ($items as $item)
    @php $total += $item->price; @endphp
@endforeach

<p>Total: {{ $total }}</p>

Итог

Laravel — удобный, но из коробки он медленный, если относиться к нему как к магии.

  • Eloquent без with() — это пуля в голову базе.
  • Query Builder — не стыдно, а спасение.
  • Blade — это шаблон, а не место для бизнес-логики.

Хочешь, чтобы проект жил долго и не падал от первой же нагрузки? Оптимизируй. Не потому что «так правильно», а потому что серверы не бесплатные, а пользователи не будут ждать, пока твой Blade родит страницу.