matchMany method

List<Map<String, dynamic>> matchMany(
  1. List<Map<String, dynamic>> models,
  2. List<Map<String, dynamic>> results,
  3. String relation,
  4. String parentKey,
  5. String relatedKey,
)

Match many related models to parents (for normal relations)

Implementation

List<Map<String, dynamic>> matchMany(
  List<Map<String, dynamic>> models,
  List<Map<String, dynamic>> results,
  String relation,
  String parentKey,
  String relatedKey,
) {
  if (models.isEmpty) {
    return models;
  }
  // No early return on empty [results]: every parent still has to come
  // back carrying an empty list, not a missing key.
  Map<dynamic, List<Map<String, dynamic>>> dictionary = {};

  for (var result in results) {
    final key = result[relatedKey];
    if (!dictionary.containsKey(key)) {
      dictionary[key] = [];
    }
    dictionary[key]!.add(result);
  }

  models = models.map<Map<String, dynamic>>((Map<String, dynamic> model) {
    final key = model[parentKey];
    Map<String, dynamic> cloneModel = Map.from(model);
    if (dictionary.containsKey(key)) {
      cloneModel[relation] = dictionary[key];
    } else {
      cloneModel[relation] = [];
    }
    return cloneModel;
  }).toList();

  return models;
}