Query Builder
A fluent SQL builder for constructing complex queries.
Table of contents
Creating a Query Builder
$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();
Available SELECT clauses
| Method | Description |
|---|---|
select(...$columns) |
Set columns to select |
from($table, $alias) |
Set the table and optional alias |
leftJoin($from, $table, $alias, $condition) |
Add a LEFT JOIN |
innerJoin($from, $table, $alias, $condition) |
Add an INNER JOIN |
rightJoin($from, $table, $alias, $condition) |
Add a RIGHT JOIN |
where($expression) |
Set the WHERE clause (replaces previous) |
andWhere($expression) |
Add an AND condition to WHERE |
orWhere($expression) |
Add an OR condition to WHERE |
groupBy(...$columns) |
Set GROUP BY columns |
having($expression) |
Set the HAVING clause |
orderBy($column, $direction) |
Set ORDER BY (replaces previous) |
addOrderBy($column, $direction) |
Add an additional ORDER BY |
setMaxResults($limit) |
Set the LIMIT |
setFirstResult($offset) |
Set the 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();
Parameters
Use named parameters with :paramName syntax:
$qb->where('status = :status')
->setParameter('status', 'active');
Or positional parameters with ?:
$qb->where('status = ?')
->setParameter(0, 'active');
Getting the Raw SQL
$sql = $qb->getSQL();
// e.g. "SELECT u.id, u.name FROM users u WHERE u.status = :status"
Executing Queries
| Method | Description | Use for |
|---|---|---|
fetchAllAssociative() |
Returns all rows as arrays | SELECT |
fetchAssociative() |
Returns a single row | SELECT |
fetchOne() |
Returns a single scalar | SELECT COUNT, etc. |
executeQuery() |
Returns a PDOStatement |
SELECT |
executeStatement() |
Returns affected row count | INSERT/UPDATE/DELETE |