Group By and Having

groupBy

Name

Type

Required

Default

Description

groups

string | array

true

A single column name, a list of column names, or an array of column names to group by. An Expression can be passed as well.

Passing a single string will group by that one column.

QueryBuilder
query.from( "users" )
.groupBy( "country" );
MySQL
SELECT *
FROM `users`
GROUP BY `country`

You can also pass a list of column names. A single comma (",") will be used as the delimiter.

QueryBuilder
query.from( "users" )
.groupBy( "country,city" );
MySQL
SELECT *
FROM `users`
GROUP BY `country`, `city`

An array of column names can be provided.

QueryBuilder
query.from( "users" )
.groupBy( [ "country", "city" ] );
MySQL
SELECT *
FROM `users`
GROUP BY `country`, `city`

Calling groupBy multiple times will to the current groups.

QueryBuilder
query.from( "users" )
.groupBy( "country" )
.groupBy( "city" );
MySQL
SELECT *
FROM `users`
GROUP BY `country`, `city`

An Expression can be passed in place of a column.

QueryBuilder
query.from( "users" )
.groupBy( query.raw( "DATE(created_at)" ) );
MySQL
SELECT *
FROM `users`
GROUP BY DATE(created_at)

having

Name

Type

Required

Default

Description

column

string | Expression

true

The name of the column or Expression with which to constrain the query.

operator

any

false

The operator to use for the constraint (i.e. "=", "<", ">=", etc.). A value can be passed as the operator and the value left null as a shortcut for equals (e.g. where( "column", 1 ) == where( "column", "=", 1 ) ).

value

any

false

The value with which to constrain the column. An Expression can be passed as well.

combinator

string

false

"and"

The boolean combinator for the clause. Valid options are "and" or "or". Avoid passing this parameter explicitly. Where possible use the andHaving and orHaving methods instead.

Adds a having clause to a query.

QueryBuilder
query.from( "users" )
.groupBy( "email" )
.having( "email", ">", 1 );
MySQL
SELECT *
FROM `users`
GROUP BY `email`
HAVING `email` > ?

Expressions can be used in place of the column or the value.

QueryBuilder
query.from( "users" )
.groupBy( "email" )
.having( query.raw( "COUNT(email)" ), ">", 1 );
MySQL
SELECT *
FROM `users`
GROUP BY `email`
HAVING COUNT(email) > ?