belongsToMany<T extends Model> method

Future<List<T>> belongsToMany<T extends Model>({
  1. required PivotTable<Model, Model> table,
  2. DatabaseDisk disk = Model.defaultDisk,
})

Implementation

Future<List<T>> belongsToMany<T extends Model>({required PivotTable table, DatabaseDisk disk = Model.defaultDisk}) async {

  try {

    final pivotTableName = table.name;

    final childPrefix = getInstanceTableSingularName();
    final siblingPrefix = Model.getTableSingularName<T>();

    switch (disk) {
      case DatabaseDisk.sqlite:
        final constructor = SQLiteModel.migrations[T];
        if (constructor == null) return [];

        final sqliteDB = App().container.make<SQLiteDatabase>();

        // e.g user_role pivot table
        final childField = "${childPrefix}_id";
        final siblingField = "${siblingPrefix}_id";

        //
        final pivotRecords = await sqliteDB.query(pivotTableName, where: '$childField = ?', whereArgs: [id]);

        final siblingIDs = pivotRecords.map((record) => record[siblingField]).toList();
        final idsString = siblingIDs.join(",");

        final siblingsRecords = await sqliteDB.query(Model.getTableName<T>(), columns: ['id'], where: 'id IN ($idsString)', whereArgs: siblingIDs);

        return siblingsRecords.map((sibling) => constructor(sibling) as T).toList();

      case DatabaseDisk.file:
      // TODO: Handle case.
        throw UnimplementedError();
      case DatabaseDisk.pgsql:
      // TODO: Handle case.
        throw UnimplementedError();
      case DatabaseDisk.s3:
      // TODO: Handle case.
        throw UnimplementedError();
    }

  } catch(e, stack) {
    App().archeryLogger.error("Error resolving belongsToMany", {"origin": "ext ModelRelationships belongsToMany", "error": e.toString(), "stack": stack.toString()});
    return [];

  }




}