Построитель запросов

Fluent SQL-построитель для формирования сложных запросов.

Содержание

Создание построителя запросов

$qb = $connection->createQueryBuilder();

SELECT

$qb = $connection->createQueryBuilder();

$rows = $qb->select('u.id', 'u.name', 'p.title')
    ->from('users', 'u')
    ->leftJoin('u', 'posts', 'p', 'p.user_id = u.id')
    ->where('u.status = :status')
    ->andWhere('u.created_at > :date')
    ->groupBy('u.id')
    ->having('COUNT(p.id) > :min')
    ->orderBy('u.name', 'ASC')
    ->addOrderBy('u.id', 'DESC')
    ->setMaxResults(10)
    ->setFirstResult(0)
    ->setParameter('status', 'active')
    ->setParameter('date', '2025-01-01')
    ->setParameter('min', 5)
    ->fetchAllAssociative();

Доступные методы SELECT

Метод Описание
select(...$columns) Задать колонки для выборки
from($table, $alias) Задать таблицу и опциональный алиас
leftJoin($from, $table, $alias, $condition) Добавить LEFT JOIN
innerJoin($from, $table, $alias, $condition) Добавить INNER JOIN
rightJoin($from, $table, $alias, $condition) Добавить RIGHT JOIN
where($expression) Задать условие WHERE (заменяет предыдущее)
andWhere($expression) Добавить AND-условие к WHERE
orWhere($expression) Добавить OR-условие к WHERE
groupBy(...$columns) Задать колонки GROUP BY
having($expression) Задать условие HAVING
orderBy($column, $direction) Задать ORDER BY (заменяет предыдущий)
addOrderBy($column, $direction) Добавить дополнительный ORDER BY
setMaxResults($limit) Задать LIMIT
setFirstResult($offset) Задать OFFSET

INSERT

$qb = $connection->createQueryBuilder();

$qb->insert('users')
    ->values([
        'name'  => ':name',
        'email' => ':email',
    ])
    ->setParameter('name', 'Alice')
    ->setParameter('email', 'alice@example.com')
    ->executeStatement();

UPDATE

$qb = $connection->createQueryBuilder();

$qb->update('users')
    ->set('name', ':name')
    ->where('id = :id')
    ->setParameter('name', 'Alice Updated')
    ->setParameter('id', 1)
    ->executeStatement();

DELETE

$qb = $connection->createQueryBuilder();

$qb->delete('users')
    ->where('id = :id')
    ->setParameter('id', 1)
    ->executeStatement();

Параметры

Используйте именованные параметры с синтаксисом :paramName:

$qb->where('status = :status')
    ->setParameter('status', 'active');

Или позиционные параметры с ?:

$qb->where('status = ?')
    ->setParameter(0, 'active');

Получение сырого SQL

$sql = $qb->getSQL();
// например: "SELECT u.id, u.name FROM users u WHERE u.status = :status"

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

Метод Описание Для чего
fetchAllAssociative() Возвращает все строки как массивы SELECT
fetchAssociative() Возвращает одну строку SELECT
fetchOne() Возвращает скалярное значение SELECT COUNT и т.д.
executeQuery() Возвращает PDOStatement SELECT
executeStatement() Возвращает кол-во затронутых строк INSERT/UPDATE/DELETE