loadRelations method
Implementation
Future<List<T>> loadRelations(List<T> items, {dynamic include}) async
{
if (include == null) return items;
// Allow only List or Map
if (include is! List && include is! Map) {
throw Exception(
"Includes must be a List or Map. Got: ${include.runtimeType}"
);
}
if (include.isEmpty) return items;
// 1. Normalize includes → { relationName: scopeFunction }
final normalized = normalizeIncludes(include);
// 2. For each relation, apply the scope and load it
for (final entry in normalized.entries) {
final relName = entry.key;
final includeScope = entry.value; // RelationScope
final rel = relations()[relName];
if (rel == null) continue;
if (rel.type == RelationType.morphTo) {
// MorphTo uses the scope directly on *real* models
await _loadMorphTo(items, rel, relName, includeScope);
continue;
}
// Non-morph relations → keep old behaviour
final scopedQuery = includeScope(rel.child.query());
await _loadHasOneOrMany(items, rel, relName, overrideQuery: scopedQuery);
await _loadBelongsTo(items, rel, relName, overrideQuery: scopedQuery);
await _loadBelongsToMany(items, rel, relName, overrideQuery: scopedQuery);
for (final item in items) {
item.setLoadedIncludes({relName: includeScope});
}
}
return items;
}