Как сформировать запрос в Laravel на уровне моделей?

«Как сформировать запрос в Laravel на уровне моделей?» — вопрос из категории Laravel, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Laravel для работы с базой данных на уровне моделей используется Eloquent ORM. Это объектно-ориентированный слой абстракции, который позволяет строить запросы через методы модели.

Основные операции:

// Получение всех записей модели
$users = User::all();

// Получение записей с условиями (Fluent Builder)
$activeUsers = User::where('status', 'active')
                   ->where('age', '>', 18)
                   ->orderBy('created_at', 'desc')
                   ->limit(10)
                   ->get();

// Поиск по первичному ключу
$user = User::find(1);

// Первый результат, удовлетворяющий условию
$user = User::where('email', 'john@example.com')->first();

// Создание новой записи
$user = User::create([
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'password' => Hash::make('secret')
]);

// Массовое обновление
User::where('last_login', '<', now()->subYear())
    ->update(['status' => 'inactive']);

// Удаление
$user->delete();
User::destroy(1, 2, 3);

// Загрузка отношений (если они определены в модели)
$posts = User::find(1)->posts()->where('published', true)->get();

Ключевые особенности Eloquent:

  • Fluent-интерфейс: Цепочка методов для построения запроса.
  • Отношения (Relationships): Простое определение связей hasOne, hasMany, belongsTo, belongsToMany, morphTo.
  • Мутаторы и Аксессоры: Позволяют форматировать атрибуты при получении и сохранении.
  • Scope'ы: Локальные и глобальные scope'ы для повторного использования условий запроса.
  • Массовое присвоение: Защита полей через $fillable или $guarded.
  • Защита от SQL-инъекций: Параметризованные запросы используются по умолчанию.

Для очень сложных или специфичных запросов, где производительность Eloquent может быть недостаточной, можно напрямую использовать Query Builder через DB::table('users'), но Eloquent предоставляет более выразительный и удобный синтаксис для большинства задач.