Всегда ли нужна ORM для операций чтения из базы данных?

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

Ответ

Нет, ORM не всегда обязательна для чтения. Выбор между ORM и сырым SQL зависит от контекста задачи, требований к производительности и сложности запроса.

Когда ORM (например, Eloquent) отлично подходит:

  • Скорость разработки: Для стандартных CRUD-операций и работы со связями (eager loading).
  • Сложные объектные графы: Когда нужно получить сущность со всеми связанными данными.
    // Eloquent: Удобно и читаемо
    $invoices = Invoice::with(['client.company', 'items'])
    ->where('status', 'paid')
    ->whereBetween('created_at', [$startDate, $endDate])
    ->get();

Когда лучше использовать Query Builder или сырой SQL:

  • Сложные аналитические запросы: С агрегациями, оконными функциями, UNION.
  • Критичная к производительности выборка: Когда ORM генерирует неоптимальный запрос.
  • Массовая обработка данных: Для избежания нагрузки на память от гидратации множества объектов.
// Query Builder для сложного запроса
$report = DB::table('orders AS o')
    ->selectRaw('
        o.user_id,
        SUM(o.total) as total_spent,
        COUNT(o.id) as order_count,
        MAX(o.created_at) as last_order_date
    ')
    ->join('users AS u', 'o.user_id', '=', 'u.id')
    ->where('o.status', 'completed')
    ->groupBy('o.user_id')
    ->having('order_count', '>', 5)
    ->get(); // Возвращает коллекцию stdClass, а не модели

Мой подход: Я начинаю с ORM для читаемости и поддерживаемости. Если профилирование (например, с помощью Laravel Debugbar или анализа логов медленных запросов) показывает узкое место, я оптимизирую конкретный запрос, переписав его на Query Builder или сырой SQL, сохраняя при этом удобство ORM для остальных частей приложения.