getRelationFromMaps method

Future<List<Map<String, dynamic>>> getRelationFromMaps(
  1. List<Map<String, dynamic>> data,
  2. String tableName,
  3. String localKey,
  4. String foreignKey, {
  5. String? relationName,
  6. dynamic defaultNull = DEFAULT_NULL,
  7. dynamic callback_fields(
    1. Map<String?, dynamic>
    )?,
  8. dynamic callback_query(
    1. QueryBuilder
    )?,
  9. dynamic isSingle = false,
})

@param data @param tableName nome da tabela relacionada @param localKey key id da tabela relacionada @param foreignKey id contido nos dados passados pelo parametro data para comparar com o key id da tabela relacionada @param relationName nome da chave no map que estara com o resultado @param defaultNull valor padrão para a chave no map caso não tenha resultado List | null

@param null callback_fields Este parametro deve ser uma função anonima com um parametro que é o campo utilizada para alterar as informações de um determinado campo vindo do banco Exemplo: (field) { field'description' = strip_tags(field'description'); }

@param null $callback_query Este parametro deve ser uma função com um parametro. Neste parametro você receberá a query utilizada na consulta, possibilitando realizar operações de querys extras para esta ação.

Exemplo: (query) { query.orderBy('field_name', 'asc'); }

@param bool isSingle

Implementation

Future<List<Map<String, dynamic>>> getRelationFromMaps(
  List<Map<String, dynamic>> data,
  String tableName,
  String localKey,
  String foreignKey, {
  String? relationName,
  dynamic defaultNull = DEFAULT_NULL,
  Function(Map<String?, dynamic>)? callback_fields,
  Function(QueryBuilder)? callback_query,
  isSingle = false,
}) async {
  //1º obtem os ids
  var itens_id = <dynamic>[];
  for (var map in data) {
    var itemId = map.containsKey(foreignKey) ? map[foreignKey] : null;

    //não adiciona se for nulo ou vazio ou diferente de int
    if (itemId != null) {
      itens_id.add(itemId);
    }
  }

  //instancia o objeto query builder
  var query = select().from(tableName);
  //checa se foi passado callback_query para mudar a query
  if (callback_query != null) {
    callback_query(query);
  }

  List<Map<String?, dynamic>>? queryResult;
  //se ouver itens a serem pegos no banco
  if (itens_id.isNotEmpty) {
    //prepara a query where in e executa
    query.whereRaw(
        '"$tableName"."$localKey" in (${itens_id.map((e) => "'$e'").join(",")})');
    queryResult = await query.getAsMap();
  } else {
    queryResult = null;
  }

  //verifica se foi passado um nome para o node de resultados
  if (relationName != null) {
    relationName = relationName + '';
  } else {
    relationName = tableName;
  }
  if (isSingle) {
    defaultNull = null;
  }

  //var result = <Map<String, dynamic>>[];
  //intera sobre a lista de dados passados
  for (var item in data) {
    //result.add({relationName: defaultNull});
    item[relationName] = defaultNull;
    var conjunto = [];
    //faz o loop sobre os resultados da query
    if (queryResult != null) {
      for (Map<String?, dynamic>? value in queryResult) {
        if (value is Map<String, dynamic>) {
          //verifica se o item corrente tem relação com algum filho trazido pela query
          if (item[foreignKey] == value[localKey]) {
            //checa se foi passado callback_fields
            if (callback_fields != null) {
              value = callback_fields(value);
            }
            //verifica se é para trazer um filho ou varios
            if (isSingle) {
              item[relationName] = value ?? defaultNull;
              break;
            } else {
              conjunto.add(value ?? defaultNull);
            }

            item[relationName] = conjunto;
          }
        }
      }
    }
  }

  //fim
  return data;
}