matchToMany method

List<Map<String, dynamic>> matchToMany(
  1. List<Map<String, dynamic>> parents,
  2. List<Map<String, dynamic>> results,
  3. String relation,
  4. String parentLocalKey,
  5. String parentPivotKey,
  6. String relatedPivotKey, {
  7. List<String> pivotFields = const [],
})

Implementation

List<Map<String, dynamic>> matchToMany(
  List<Map<String, dynamic>> parents,
  List<Map<String, dynamic>> results,
  String relation,
  String parentLocalKey,
  String parentPivotKey,
  String relatedPivotKey, {
  List<String> pivotFields = const [],
}) {
  final lookup = <dynamic, List<Map<String, dynamic>>>{};
  for (var row in results) {
    final pivotVal = row[parentPivotKey];
    lookup.putIfAbsent(pivotVal, () => []).add(row);
  }
  return parents.map((parent) {
    final cloned = Map<String, dynamic>.from(parent);
    final primaryVal = parent[parentLocalKey];
    final joinedRows = lookup[primaryVal] ?? [];

    final relatedList = joinedRows.map((row) {
      final relatedData = Map<String, dynamic>.from(row)
        ..remove(parentPivotKey)
        ..remove(relatedPivotKey)
        ..removeWhere((k, _) => pivotFields.contains(k));
      return relatedData;
    }).toList();

    cloned[relation] = relatedList;
    return cloned;
  }).toList();
}