← Назад к вопросам

Пользовался ли Query Builder?

1.7 Middle🔥 191 комментариев
#Другое

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Использование Query Builder в PHP (Laravel)

Да, я активно использовал Query Builder, особенно в рамках фреймворка Laravel. Это один из ключевых инструментов для работы с базой данных в современных PHP проектах. Моё использование охватывает как стандартные операции, так и сложные, оптимизированные запросы.

Основные преимущества Query Builder над "сырыми" SQL

  • Безопасность: Автоматическое экранирование параметров через bindings предотвращает SQL-инъекции. Механизм PDO работает "под капотом".
  • Читаемость и структура: Методы (select(), where(), join()) создают логичную, легко читаемую цепочку, которую можно разбивать на части.
  • Абстракция от драйвера DB: Пишем один код для MySQL, PostgreSQL, SQLite. Query Builder генерирует специфичный SQL.
  • Гибкость: Легко модифицировать запросы динамически (добавить условия, сортировку), что сложно делать с конкатенацией строк SQL.

Типичные сценарии использования с примерами кода

1. Базовые выборки и фильтрация

// Простой select с условиями
$users = DB::table('users')
            ->select('id', 'email', 'created_at')
            ->where('active', 1)
            ->whereBetween('created_at', ['2023-01-01', '2023-12-31'])
            ->orderBy('email', 'desc')
            ->limit(10)
            ->get();

// Использование условных операторов (or, and, группировка)
$products = DB::table('products')
              ->where('category_id', 5)
              ->orWhere(function ($query) {
                  $query->where('price', '>', 100)
                        ->where('stock', '>', 0);
              })
              ->get();

2. Сложные JOIN-запросы и агрегация

// LEFT JOIN с агрегатной функцией и группировкой
$orders = DB::table('orders')
            ->leftJoin('users', 'orders.user_id', '=', 'users.id')
            ->select(
                'users.name',
                DB::raw('COUNT(orders.id) as order_count'),
                DB::raw('SUM(orders.total) as total_sum')
            )
            ->groupBy('users.id')
            ->having('order_count', '>', 5)
            ->get();

// Использование подзапросов (subquery)
$latestPosts = DB::table('posts')
                 ->whereIn('user_id', function ($subQuery) {
                     $subQuery->from('users')
                              ->select('id')
                              ->where('status', 'active');
                 })
                 ->get();

3. Операции INSERT, UPDATE, DELETE с транзакциями

// Массовое обновление с транзакцией для безопасности
DB::transaction(function () {
    DB::table('inventory')
        ->where('warehouse_id', 1)
        ->where('quantity', '<', 10)
        ->update([
            'status' => 'low_stock',
            'updated_at' => now()
        ]);

    // Логирование действия в связанной таблице внутри той же транзакции
    DB::table('stock_logs')->insert([
        'warehouse_id' => 1,
        'action' => 'marked_low_stock',
        'log_date' => now()
    ]);
});

Проблемы и оптимизация

  • N+1 проблема: Query Builder не защищает автоматически от нее, как Eloquent с with(). Но можно использовать join или подзапросы для её решения.
  • Сложные условия: Для очень специфичных SQL-операций (например, оконные функции) иногда приходится использовать DB::raw(), что снижает безопасность. Важно экранировать данные вручную.
  • Производительность: Для больших данных важно использовать chunk() вместо get(), и выбирать только нужные поля (select()), избегая SELECT *.

Сравнение с Eloquent ORM

Query Builder — это слой над PDO, а Eloquent — над Query Builder. Я использовал Query Builder, когда:

  • Нужна максимальная скорость выполнения запроса (меньше накладных расходов Eloquent).
  • Запрос очень сложный, с множеством join и агрегаций.
  • Работа с таблицами, не имеющими моделей (например, временные таблицы, аудит-логи).
  • Проект не использует Laravel, но есть библиотека с похожим Query Builder (например, в Slim или собственной архитектуре).

В итоге, Query Builder — это мощный, безопасный и гибкий инструмент. Он сочетает удобство объектно-ориентированного API с мощностью SQL, делая код для работы с БД более поддерживаемым и безопасным, чем прямая работа с SQL-строками.