brick icon indicating copy to clipboard operation
brick copied to clipboard

Upsert hang forever when having Many-to-Many relationship between models

Open KiddoV opened this issue 4 months ago • 2 comments

I have a many-to-many models like:

// Model A
@ConnectOfflineFirstWithSupabase(
	supabaseConfig: SupabaseSerializable(tableName: "groups"),
)
class Group extends OfflineFirstWithSupabaseModel {
	@Supabase(unique: true)
	@Sqlite(index: true, unique: true)
	final String id;

[...]
}

// Model B
@ConnectOfflineFirstWithSupabase(
	supabaseConfig: SupabaseSerializable(tableName: "persons")
)
class Person extends OfflineFirstWithSupabaseModel {
	@Supabase(unique: true)
	@Sqlite(index: true, unique: true)
	final String id;
[...]
}

// Join model
@ConnectOfflineFirstWithSupabase(
	supabaseConfig: SupabaseSerializable(tableName: "_group_persons_"),
)
class GroupPersons extends OfflineFirstWithSupabaseModel {
	@Supabase(unique: true)
	@Sqlite(index: true, unique: true)
	final String id;
	//
	@Supabase(foreignKey: "group_id", ignoreTo: true)
	@Sqlite(index: true)
	final Group group;
	@Sqlite(ignore: true)
	String get groupId => group.id;
	@Supabase(foreignKey: "person_id", ignoreTo: true)
	@Sqlite(index: true)
	final Person person;
	@Sqlite(ignore: true)
	String get personId => person.id;
	///
	GroupPersons({
		String? id,
		required this.group,
		required this.person,
	}) :
		id = id ?? const Uuid().v7();
[...]
}

When I upsert like:

	static Future<Group> createWithMembers({required User creator, required List<Person> members, String? name}) async {
		// Construct a group
		final tempGroup = Group(creatorId: creator.localId, name: name, memberLinks: []);
		// Create memberLinks now linking to this group
		final memberLinks = members.map((p) => GroupPersons(group: tempGroup, person: p)).toList();
		// Assign memberLinks to group 
		final toGroup = tempGroup.copyWith(memberLinks: memberLinks);
		//
		return appDB.upsert<Group>(toGroup);
	}

The operation is hanging forever. Am I doing it wrong? How do you handle creation in Many-to-Many relationship then?

KiddoV avatar Aug 19 '25 13:08 KiddoV