Skip to content

Query Builder Examples

This page provides detailed examples for building queries with the CakePHP Query Builder in ZubZet.


Basic WHERE Conditions

Simple Equality

$query = $this->dbSelect(['id', 'name', 'email'], 'users')
              ->where(['status' => 'active']);
SELECT id, name, email
FROM users
WHERE status = 'active'

Multiple Conditions (AND)

By default, multiple conditions in where() are combined with AND:

$query = $this->dbSelect(['id', 'name'], 'users')
              ->where([
                  'status' => 'active',
                  'role' => 'admin'
              ]);
SELECT id, name
FROM users
WHERE status = 'active' 
AND role = 'admin'

Chained WHERE (AND)

You can also chain multiple where() calls:

$query = $this->dbSelect(['id', 'name'], 'users')
              ->where(['status' => 'active'])
              ->where(['role' => 'admin']);
SELECT id, name
FROM users
WHERE status = 'active'
AND role = 'admin'

OR Conditions

Using OR

$query = $this->dbSelect(['id', 'name'], 'users')
              ->where([
                  'OR' => [
                      'role' => 'admin',
                      'id' => 1
                  ]
              ]);
SELECT id, name
FROM users
WHERE (
    role = 'admin' OR
    id = 1
)

Combined AND and OR

$query = $this->dbSelect(['id', 'name'], 'users')
              ->where([
                  'status' => 'active',
                  'OR' => [
                      'role' => 'admin',
                      'id' => 1
                  ]
              ]);
SELECT id, name
FROM users
WHERE (
    status = 'active' AND (
        role = 'admin' OR
        id = 1
        )
    )

IN and NOT IN

WHERE IN List

$query = $this->dbSelect(['id', 'name'], 'users')
              ->whereInList('id', [1, 2, 3, 4, 5]);
SELECT id, name
FROM users
WHERE id in (1, 2, 3, 4, 5)

WHERE NOT IN List

$query = $this->dbSelect(['id', 'name'], 'users')
              ->whereNotInList('id', [1, 2, 3, 4, 5]);
SELECT id, name
FROM users
WHERE id not in (1, 2, 3, 4, 5)

Comparison Operators (Expressions)

Greater Than (>)

$query = $this->dbSelect(['id', 'name', 'age'], 'users')
              ->where(['age >' => 18]);
SELECT id, name, age
FROM users
WHERE age > 18

Greater Than or Equal (>=)

$query = $this->dbSelect(['id', 'name', 'age'], 'users')
              ->where(['age >=' => 21]);
SELECT id, name, age
FROM users
WHERE age >= 21

Less Than (<)

$query = $this->dbSelect(['id', 'name', 'price'], 'products')
              ->where(['price <' => 100]);
SELECT id, name, price
FROM products
WHERE price < 100

Not Equal (!=)

$query = $this->dbSelect(['id', 'name'], 'users')
              ->where(['status !=' => 'deleted']);
SELECT id, name
FROM users
WHERE status != 'deleted'

BETWEEN

$query = $this->dbSelect(['id', 'name', 'price'], 'products')
              ->where(['price >=' => 10, 'price <=' => 100]);
SELECT id, name, price
FROM products WHERE (
    price >= 10 AND
    price <= 100
)

LIKE Conditions

Simple LIKE

$query = $this->dbSelect(['id', 'name'], 'users')
              ->where(['name LIKE' => '%john%']);
SELECT id, name
FROM users
WHERE name like '%john%'

NOT LIKE

$query = $this->dbSelect(['id', 'name'], 'users')
              ->where(['name NOT LIKE' => '%test%']);
SELECT id, name
FROM users
WHERE name not like '%test%'

NULL Conditions

IS NULL

$query = $this->dbSelect(['id', 'name'], 'users')
              ->whereNull('deleted_at');
SELECT id, name
FROM users
WHERE (deleted_at) IS NULL

IS NOT NULL

$query = $this->dbSelect(['id', 'name'], 'users')
              ->whereNotNull('deleted_at');
SELECT id, name
FROM users
WHERE (deleted_at) IS NOT NULL

Column Aliases

Select with Aliases

$query = $this->dbSelect([
                  'id',
                  'user_name' => 'name',
                  'user_email' => 'email'
              ], 'users');

$result = $this->exec($query);
SELECT id,
    name AS user_name,
    email AS user_email
FROM users

Table Alias

$query = $this->dbSelect(['u.id', 'u.name'], ['u' => 'users'])
              ->where(['u.status' => 'active']);
SELECT u.id, u.name
FROM users u
WHERE u.status = 'active'

JOINs

INNER JOIN

$query = $this->dbSelect(['users.id', 'users.name', 'orders.total'], 'users')
              ->innerJoin('orders', ['users.id = orders.user_id']);
SELECT
    users.id,
    users.name,
    orders.total
FROM users
INNER JOIN orders orders
ON users.id = orders.user_id

LEFT JOIN

$query = $this->dbSelect(['users.id', 'users.name', 'orders.total'], 'users')
              ->leftJoin('orders', ['users.id = orders.user_id']);
SELECT
    users.id,
    users.name,
    orders.total
FROM users
LEFT JOIN orders orders
ON users.id = orders.user_id

RIGHT JOIN

$query = $this->dbSelect(['users.id', 'users.name', 'orders.total'], 'users')
              ->rightJoin('orders', ['users.id = orders.user_id']);
SELECT
    users.id,
    users.name,
    orders.total
FROM users
RIGHT JOIN orders orders
ON users.id = orders.user_id

JOIN with Table Aliases

$query = $this->dbSelect(['u.id', 'u.name', 'o.total'], ['u' => 'users'])
              ->leftJoin(['o' => 'orders'], ['u.id = o.user_id']);
SELECT u.id, u.name, o.total
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id

Multiple JOINs

$query = $this->dbSelect([
                  'u.id', 
                  'u.name', 
                  'o.total', 
                  'p.name'
              ], ['u' => 'users'])
              ->leftJoin(['o' => 'orders'], ['u.id = o.user_id'])
              ->leftJoin(['p' => 'products'], ['o.product_id = p.id']);
SELECT u.id, u.name, o.total, p.name
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id
LEFT JOIN products p
ON o.product_id = p.id

JOIN with Additional Conditions

$query = $this->dbSelect(['u.id', 'u.name', 'o.total'], ['u' => 'users'])
              ->leftJoin(['o' => 'orders'], ['u.id = o.user_id', 'o.status' => 'completed']);
SELECT u.id, u.name, o.total
FROM users u
LEFT JOIN orders o
ON (
    u.id = o.user_id AND
    o.status = 'completed'
)

ORDER BY

Simple Order

$query = $this->dbSelect(['id', 'name'], 'users')
              ->orderAsc("name");
SELECT id, name
FROM users
ORDER BY name ASC

Multiple Order Columns

 $query = $this->dbSelect(['id', 'name', 'created'], 'users')
                ->orderDesc("created")
                ->orderAsc("name");
SELECT id, name, created
FROM users
ORDER BY created DESC, name ASC

LIMIT and OFFSET

Limit Results

$query = $this->dbSelect(['id', 'name'], 'users')
              ->limit(10);
SELECT id, name
FROM users
LIMIT 10

Limit with Offset (Pagination)

$query = $this->dbSelect(['id', 'name'], 'users')
              ->limit(10)
              ->offset(20);
SELECT id, name
FROM users
LIMIT 10
OFFSET 20

GROUP BY and HAVING

Simple GROUP BY

$query = $this->dbSelect(['status', 'COUNT(*) AS count'], 'users')
              ->groupBy(['status']);
SELECT status, COUNT(*) AS count
FROM users 
GROUP BY status

GROUP BY with HAVING

$query = $this->dbSelect(['status', 'COUNT(*) AS count'], 'users')
              ->groupBy(['status'])
              ->having(['COUNT(*) >' => 5]);
SELECT status, COUNT(*) AS count
FROM users
GROUP BY status
HAVING COUNT(*) > 5

DISTINCT

$query = $this->dbSelect(['status'], 'users')
              ->distinct();
SELECT DISTINCT status FROM users

Complex Query Example

Here's a complete example combining multiple features:

$query = $this->dbSelect([
                  'u.id',
                  'u.name',
                  'u.email',
                  'order_count' => 'COUNT(o.id)',
                  'total_spent' => 'SUM(o.total)'
              ], ['u' => 'users'])
              ->leftJoin(['o' => 'orders'], ['u.id = o.user_id'])
              ->where([
                  'u.status' => 'active',
                  'u.created >=' => '2025-01-01',
                  'o.status IN' => ['completed', 'shipped']
              ])
              ->group(['u.id', 'u.name', 'u.email'])
              ->having(['COUNT(o.id) >=' => 3])
              ->orderDesc('total_spent')
              ->limit(10);

$result = $this->exec($query);
SELECT
    u.id,
    u.name,
    u.email,
    COUNT(o.id) AS order_count,
    SUM(o.total) AS total_spent
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id
WHERE (
    u.status = 'active' AND
    u.created >= '2025-01-01' AND
    o.status in ('completed','shipped')
)
GROUP BY u.id, u.name, u.email
HAVING COUNT(o.id) >= 3
ORDER BY total_spent DESC
LIMIT 10

More Information

For the full CakePHP Query Builder documentation, visit:
CakePHP Database Query Builder