compile method
Compile include directive into JOIN clauses.
baseModel - The main model being queried (e.g., 'User').
baseAlias - The alias for the base table (e.g., 't0').
include - The include map from the query.
baseSelectFields - Optional list of fields to select from base model.
Returns compiled relations with JOIN clauses and aliases.
Include syntax supports selecting specific fields from relations:
include: {
'user': true, // Include all fields
'domain': {
'select': {'id': true, 'name': true} // Only id and name
},
'posts': {
'select': {'title': true},
'include': {'author': true} // Nested include
}
}
Implementation
CompiledRelations compile({
required String baseModel,
required String baseAlias,
required Map<String, dynamic> include,
List<String>? baseSelectFields,
}) {
_aliasCounter = 0;
final joins = <String>[];
final aliases = <String, ColumnAlias>{};
final includedRelations = <IncludedRelation>[];
// Add base model columns (either all or selected)
if (baseSelectFields != null && baseSelectFields.isNotEmpty) {
_addSelectedColumns(
modelName: baseModel,
tableAlias: baseAlias,
aliases: aliases,
selectedFields: baseSelectFields,
);
} else {
_addModelColumns(
modelName: baseModel,
tableAlias: baseAlias,
aliases: aliases,
);
}
// Process each include
for (final entry in include.entries) {
final relationName = entry.key;
final relationValue = entry.value;
// Skip if not included
if (relationValue == false) continue;
final relation = _schema.getRelation(baseModel, relationName);
if (relation == null) {
// Unknown relation, skip
continue;
}
final result = _compileRelation(
relation: relation,
relationName: relationName,
parentModel: baseModel,
parentAlias: baseAlias,
includeValue: relationValue,
aliases: aliases,
);
if (result != null) {
joins.add(result.joinClause);
includedRelations.add(result.includedRelation);
}
}
return CompiledRelations(
joinClauses: joins.join(' '),
columnAliases: aliases,
includedRelations: includedRelations,
);
}