Практические паттерны и итоги
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. Теперь применяй их в реальных проектах:
- Создай модель с миграцией
- Настрой связи
- Используй скоупы для переиспользуемых запросов
- Не забывай про жадную загрузку
- Оптимизируй запросы по мере роста данных
Eloquent — мощный инструмент, но не единственный. Для сложных отчётов и агрегатов используй Query Builder или чистый SQL.