Rudra FrameworkRudra Framework

Использование строителя запросов в репозиториях

Рекомендуется использовать строитель запросов (QueryBuilder) в репозиториях — это повышает читаемость и безопасность SQL-запросов за счёт параметризации и абстракции.

Для работы со строителем запросов необходимо обратиться к фасаду:

use Rudra\Model\QBFacade;

Базовые примеры

1. Простой SELECT

$qString = QBFacade::select()
    ->from(self::$table)
    ->get();

Результат SQL:

SELECT * FROM test;

Выполнение запроса:

$result = Test::qBuilder($qString);

2. Выборка конкретных полей

$qString = QBFacade::select('id, title')
    ->from(self::$table)
    ->get();

Результат SQL:

SELECT id, title FROM test;

3. Выборка с условиями (WHERE)

$qString = QBFacade::select('id, title')
    ->from(self::$table)
    ->where(':id')
    ->and(':created_at')
    ->get();

Результат SQL:

SELECT id, title FROM test WHERE :id AND :created_at;

⚠️ Важно: фасад строит сырую строку запроса. Подстановка значений параметров (:id, :created_at) осуществляется при выполнении через Test::qBuilder():

$result = Test::qBuilder($qString, [
    ':id'          => 1,
    ':created_at'  => '2022-02-23 14:36:06'
]);

Это обеспечивает защиту от SQL-инъекций.


Дополнительные конструкции

Поддерживаемые условия и конструкции:

Логические связки:

->where(':id')
->or(':created_at')

Сложные условия в одном where():

->where(':id AND :created_at')
->where(':id OR :created_at')

Специальные SQL-выражения:

->where('id BETWEEN :id AND :id2')
->where('title LIKE :search')

Пагинация:

->limit('10')->offset('20')

Сортировка и группировка:

->orderBy('created_at DESC')
->groupBy('category_id')

Объединение таблиц (JOIN)

По умолчанию используется LEFT JOIN:

->join("users")->on("items.user_id = users.id")

Тип объединения можно изменить:

->join("users", "INNER")->on("items.user_id = users.id")
->join("users", "RIGHT")->on("items.user_id = users.id")
->join("users", "CROSS")->on("1=1") // осторожно с CROSS JOIN!

Завершение построения запроса

Каждый запрос обязательно должен завершаться методом ->get(), который:

  • Возвращает итоговую строку SQL с точкой с запятой в конце;
  • Сбрасывает внутренний буфер строителя для повторного использования.

Особенности реализации

  • Строитель запросов не выполняет запрос сам — он лишь формирует SQL-строку.
  • Выполнение и подстановка параметров — задача модели (например, через Test::qBuilder()).
  • Поддерживается работа с MySQL, PostgreSQL и SQLite. Драйвер выбирается автоматически на основе текущего PDO-подключения.
  • Строитель не является ORM — он предоставляет fluent-интерфейс для безопасного и читаемого конструирования SQL.