loadRelations method

Future<List<T>> loadRelations(
  1. List<T> items, {
  2. dynamic include,
})

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;
}