updateMany method

  1. @override
Future<bool> updateMany(
  1. List<Map<String, dynamic>> updates,
  2. String column
)
inherited

Implementation

@override
Future<bool> updateMany(
  List<Map<String, dynamic>> updates,
  String column,
) async {
  try {
    if (updates.isEmpty) return false;

    Set<String> columns = {};
    for (var row in updates) {
      columns.addAll(row.keys.where((key) => key != column));
    }
    List<String> setClauses = [];
    var caseCounter = 0;

    for (var col in columns) {
      List<String> cases = [];
      for (var row in updates) {
        if (row.containsKey(col)) {
          final keyParamName = 'p$caseCounter';
          final valueParamName = 'p$caseCounter';
          bindings[keyParamName] = row[column];
          bindings[valueParamName] = row[col];
          cases.add("WHEN $column = :$keyParamName THEN :$valueParamName");
          caseCounter++;
        }
      }
      setClauses.add("$col = CASE ${cases.join(" ")} ELSE $col END");
    }

    List<String> whereValues = [];
    for (var i = 0; i < updates.length; i++) {
      final paramName = 'p$i';
      bindings[paramName] = updates[i][column];
      whereValues.add(":$paramName");
    }

    String sql =
        "UPDATE $getTable${buildJoins()} SET ${setClauses.join(", ")} WHERE $column IN (${whereValues.join(", ")})";
    conn = await getConnection();
    return await conn.execute(sql, bindings);
  } catch (e) {
    rethrow;
  }
}