Урок 12

Практические паттерны и итоги

Query Objects

Когда запросы становятся сложными, их выносят в отдельные классы:

namespace App\Queries;

use App\Models\Post;
use Illuminate\Http\Request;

class PostQuery
{
    public function __construct(private Request $request) {}

    public function get()
    {
        return Post::query()
            ->when($this->request->filled('search'), function ($q) {
                $q->where('title', 'like', "%{$this->request->search}%");
            })
            ->when($this->request->filled('status'), function ($q) {
                $q->where('status', $this->request->status);
            })
            ->with('user')
            ->paginate(15);
    }
}

Репозитории

Иногда доступ к данным прячут за репозиторием:

namespace App\Repositories;

use App\Models\Post;

class PostRepository
{
    public function findPublished(): \Illuminate\Database\Eloquent\Collection
    {
        return Post::where('published', true)->get();
    }
}

Но не злоупотребляй — Eloquent сам по себе является абстракцией.

Оптимизация

Выбирай только нужные колонки

Post::select('id', 'title', 'slug')->get();

Используй индексы

В миграции:

$table->index('status');
$table->index(['status', 'published_at']);

Избегай N+1

Post::with('user', 'comments')->get();

Используй chunk для больших данных

Post::chunk(200, function ($posts) {
    //
});

Что дальше

Ты освоил основные и продвинутые техники Eloquent. Теперь применяй их в реальных проектах:

  1. Создай модель с миграцией
  2. Настрой связи
  3. Используй скоупы для переиспользуемых запросов
  4. Не забывай про жадную загрузку
  5. Оптимизируй запросы по мере роста данных

Eloquent — мощный инструмент, но не единственный. Для сложных отчётов и агрегатов используй Query Builder или чистый SQL.