jsonGroupArray function
- Expression<
Object> value, { - OrderBy? orderBy,
- Expression<
bool> ? filter,
Returns a JSON array containing the result of evaluating value
in each row
of the current group.
As an example, consider two tables with a one-to-many relationship between them:
class Emails extends Table {
TextColumn get subject => text()();
TextColumn get body => text()();
IntColumn get folder => integer().references(Folders, #id)();
}
class Folders extends Table {
IntColumn get id => integer()();
TextColumn get title => text()();
}
With this schema, suppose we want to find the subject lines of every email in every folder. A join gets us all the information:
final query = select(folders)
.join([innerJoin(emails, emails.folder.equalsExp(folders.id))]);
However, running this query would duplicate rows for Folders
- if that
table had more columns, that might not be what you want. With
jsonGroupArray, it's possible to join all subjects into a single row:
final subjects = jsonGroupObject(emails.subject);
query
..groupBy([folders.id])
..addColumns([subjects]);
Running this query would return one row for each folder, where
row.read(subjects)
is a textual JSON representation of the subjects for
all emails in that folder.
This string could be turned back into a list with
(json.decode(row.read(subjects)!) as List).cast<String>()
.
Implementation
Expression<String> jsonGroupArray(
Expression value, {
OrderBy? orderBy,
Expression<bool>? filter,
}) {
return AggregateFunctionExpression('json_group_array', [value],
orderBy: orderBy, filter: filter);
}