You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:15:06