Dart如何将多个关联数据库表数据合并为一个类的列表?
多表关联类列表生成实现方案
第一步:修正现有代码错误
原有Marriage类fromJson方法存在参数名错误,需调整为:
factory Marriage.fromJson(Map<String, dynamic> json) { return Marriage( idUser: json['userID'], // 原代码错误写为name: json['mariageStatus'],此处修正 mariageStatus: json['mariageStatus'] ); }
第二步:定义正确的合并类
你草稿中的构造函数、工厂方法名与类名不匹配,修正后代码如下:
class User_Mariage { final String idUser; final String name; final String phone; final String mariageStatus; User_Mariage({ required this.idUser, required this.name, required this.phone, required this.mariageStatus }); // 场景1:后端直接返回合并数据时使用的工厂构造 factory User_Mariage.fromJson(Map<String, dynamic> json) { return User_Mariage( idUser: json['_id'], name: json['name'], phone: json['phone'], mariageStatus: json['mariageStatus'] ); } // 场景2:前端关联两个单表对象时使用的工厂构造 factory User_Mariage.fromJoin(User user, Marriage? marriage) { return User_Mariage( idUser: user.idUser, name: user.name, phone: user.phone, // 未匹配到婚姻数据时返回默认值,可按需调整 mariageStatus: marriage?.mariageStatus ?? '未知' ); } } List<User_Mariage> userMariageFromJson(jsonData) { return List<User_Mariage>.from(jsonData.map((item) => User_Mariage.fromJson(item))); }
第三步:实现合并逻辑
方案1:前端直接关联(无需改动后端)
并发拉取两个接口数据,通过id匹配生成合并列表,匹配效率为O(1):
Future<List<User_Mariage>> fetchUserWithMariage() async { // 并发请求减少等待时间 final futures = await Future.wait([fetchUser(), fetchMarriage()]); final List<User> userList = futures[0] as List<User>; final List<Marriage> marriageList = futures[1] as List<Marriage>; // 婚姻数据转Map加速匹配 final Map<String, Marriage> marriageMap = {}; for (var m in marriageList) { marriageMap[m.idUser] = m; } // 生成合并列表 return userList.map((user) => User_Mariage.fromJoin(user, marriageMap[user.idUser])).toList(); }
方案2:后端关联查询(更优实现)
如果支持调整后端接口,直接在数据库层执行关联查询,SQL示例:
SELECT u._id, u.name, u.phone, m.mariageStatus FROM userdata u LEFT JOIN 婚姻状态表 m ON u._id = m.userID
后端直接返回合并后的JSON结构,前端仅需发送一次请求,用User_Mariage.fromJson解析即可,整体性能更高,也避免了前端处理关联逻辑的额外开销。
内容的提问来源于stack exchange,提问作者Alfan
相关产品推荐
相关产品推荐

