0

我的移动应用程序中有一个非常简单的架构结构:

export const DepositSchema = {
  name: "Deposit",
  properties: {
    uuid: "string",
    payments: "Payment[]",
  },
  primaryKey: "uuid",
};

export const PaymentSchema = {
  name: Instance.Payment,
  properties: {
    payment_amount: "string",
    payment_method: "string",
    deposit: {
      type: "linkingObjects",
      objectType: "Deposit",
      property: "payments",
    },
  },
  primaryKey: "uuid",
};

所以意味着每笔存款可以有零次、一次或几次付款(可以部分支付),但一次付款应该只分配给一笔存款

我将 Payment 对象放入 Realm 数据库,如下所示:

database.manager.write(() => {
    if (payment.deposit_uuid) {
        deposit = database.manager.objectForPrimaryKey("Deposit", payment.deposit_uuid);
    }
    const createdDbPayment = database.manager.create(
        Instance.Payment,
        {
            ...payment,
            status: STATUS_TO_IGNORE,
        },
        Realm.UpdateMode.Modified,
    );
    if (deposit && createdDbPayment && deposit.payments.filtered("uuid == $0", payment.uuid).length == 0) {
        deposit.payments.push(createdDbPayment);
    }
});

同时,当我尝试记录从领域数据库获取的付款对象时,看起来我没有分配给这笔付款的一笔存款,而是获得了一系列存款。(ofc 只有一个对象,但很烦人)

问题是:有没有办法连接这个模式来呈现 One2Many(不是 many2many)关系?

我想实现: payment.deposit.uuid而不是payment.deposit[0]?.uuid感谢您的帮助

4

1 回答 1

1

我想实现: payment.deposit.uuid 而不是 payment.deposit[0]?.uuid

每当使用 LinkingObjects 时,它们都允许“自动”导航回父对象 - 但是,它们也本质上创建了多对多关系。

这就是为什么它是LinkingObjects(复数) not LinkingObject

如果只有一个可以链接回,那么您的代码将使用索引 0 来引用第一个元素

payment.deposit[0]?.uuid

LinkingObjects 的好处是为您创建了反向链接(它更多的是计算属性而不是托管属性)。另一方面,它并不完全是你想要的。

所以你需要手动创建反向链接——在某些情况下它更有意义,但你失去了“自动”关系。使用伪代码

export const DepositSchema = {
  name: "Deposit",
  properties: {
      payments: "Payment[]"
    
export const PaymentSchema = {
  name: Payment,
  properties: {
    parent_deposit: "Deposit"

我建议添加一个“addPayment”功能来为存款添加付款。当付款传递到存款属性时,父存款将添加其对付款的引用,然后将其添加到付款列表中。

这将创建从 Deposits 到多个 Payments 的正向关系,然后创建从 Payments 到其父 Deposit 的单个反向关系。

然后可以在两个方向上横切图形。

于 2021-10-25T19:30:07.980 回答