Realm中如何正确实现One2Many关系使反向关联返回单个对象
原因说明
Realm 中 linkingObjects 类型的设计就是返回集合格式,因为该类型的作用是查询所有指向当前对象的父对象,天然适配多对多、一对多场景下的反向查找,无论匹配的父对象数量有多少,都会返回数组,这是正常的设计表现。
最优解决方案:调整Schema关联逻辑
你当前的需求是标准一对多关系(1个Deposit对应多个Payment,1个Payment仅对应1个Deposit),更合理的Schema设计是将正向关联放在多的一侧(Payment)存储单个Deposit对象,反向关联放在一的一侧(Deposit)自动维护Payment列表,修改后的Schema如下:
export const DepositSchema = { name: "Deposit", properties: { uuid: "string", // 改为反向关联,自动同步所有关联的Payment payments: { type: "linkingObjects", objectType: "Payment", property: "deposit", }, }, primaryKey: "uuid", }; export const PaymentSchema = { name: Instance.Payment, properties: { // 注意你原Schema漏写了uuid字段,主键必须在properties中定义 uuid: "string", payment_amount: "string", payment_method: "string", // 正向关联唯一Deposit,若允许无关联可设为可选类型 "Deposit?" deposit: "Deposit", }, primaryKey: "uuid", };
对应的写入逻辑可以简化,无需手动操作Deposit的payments列表,Realm会自动维护反向关联:
database.manager.write(() => { let deposit = null; if (payment.deposit_uuid) { deposit = database.manager.objectForPrimaryKey("Deposit", payment.deposit_uuid); } const createdDbPayment = database.manager.create( Instance.Payment, { ...payment, status: STATUS_TO_IGNORE, // 直接赋值关联的Deposit即可 deposit: deposit }, Realm.UpdateMode.Modified, ); // 无需手动执行deposit.payments.push操作 });
修改后你就可以直接通过 payment.deposit.uuid 获取关联Deposit的uuid,同时deposit.payments 仍然可以正常获取该Deposit下所有关联的Payment列表。
兼容方案:不修改现有Schema
如果你不想改动现有Schema结构,可以给Payment对象扩展一个getter封装取首元素的逻辑:
// 如果你使用类式定义Schema class Payment extends Realm.Object { get relatedDeposit() { return this.deposit[0]; } static schema = { // 保留你原来的PaymentSchema定义 } }
后续直接使用 payment.relatedDeposit?.uuid 即可,无需每次写数组下标。
内容的提问来源于stack exchange,提问作者Jaroslaw K.
相关产品推荐
相关产品推荐

