SQL Clauses¶
JOIN Clause¶
To create join, use one of the following methods: join, innerJoin, leftJoin, rightJoin, straightJoin or crossJoin.
Join method signature looks like this:
join($table, string $alias = null, string $joinOn = null) : TableInterface
- Argument $table can be one of following types:
- table name
- class name
- closure
- object implementing QueryBuilderInterface
// Table name:
$qb->join('account');
// Class name:
$qb->join(AccountTable::class);
// Closure:
$qb->join(function (AccountTable $accountTable) {
});
// Another QueryBuilder:
$qb->join($anotherQb);
Arguments $alias and $joinOn are optional. You can set them later directly on the object table.
$qb->from('user', 'u');
$qb->join('account', 'a', 'u.id = a.user_id');
And equivalent code:
$userTable = $qb->from('user', 'u');
$accountTable = $qb->join('account');
$accountTable->setAlias('a');
$accountTable->joinOn("{$userTable->column('id')} = {$accountTable->column('user_id')}");
OUTER and NATURAL JOIN¶
To determine join as OUTER or NATURAL use methods: AbstractTable::setNaturalJoin() or AbstractTable::setOuterJoin()
$userTable = $qb->leftJoin('user', 'u');
$userTable->setNaturalJoin(true);
$userTable->setOuterJoin(true);
WHERE Clause¶
$qb->andWhere('u.active = 1');
$qb->andWhere('u.email IS NOT NULL');
WHERE u.active = 1 AND u.email IS NOT NULL
GROUP BY Clause¶
$qb->addGroupBy('YEAR(u.created_at) ASC');
$qb->addGroupBy('u.affiliate_id');
GROUP BY YEAR(u.country_id) ASC, u.affiliate_id
GROUP BY ... WITH ROLLUP¶
For use the WITH ROLLUP clause, use setGroupByWithRollUp(true):
$qb->addGroupBy('u.country_id');
$qb->addGroupBy('u.male');
$qb->setGroupByWithRollUp(true);
GROUP BY u.country_id, u.male WITH ROLLUP
HAVING Clause¶
$qb->addSelect('SUM(i.gross) AS gross');
$qb->addSelect('i.transactor_id');
$qb->from('invoice', 'i');
$qb->addGroupBy('i.transactor_id'):
$qb->andHaving('gross > 1000');
SELECT SUM(i.gross) AS gross, i.transactor_id
FROM invoice AS i GROUP BY i.transactor_id HAVING gross > 1000
ORDER BY Clause¶
$qb->addOrderBy('u.last_name ASC');
$qb->addOrderBy('u.first_name ASC');
ORDER BY u.last_name ASC, u.first_name ASC
LIMIT Clause¶
$qb->setLimit(10);
$qb->setLimit('10, 20');
$qb->setLimit('10 OFFSET 20');