在 Objection.js 中,设置 relationMappings 有什么好处?

In Objection.js, what's the benefit of setting up relationMappings?

我对 relationMappings 在 Objection.js 模型 class.

中的作用有点困惑

我认为一旦我们在模型中设置了关系映射,我们就会在每个查询中获得相关数据。但是,事实证明我仍然只有模型属性本身。

我还应该使用什么来获取查询中的相关数据吗?

关系映射为模型语义提供了如何在需要时获取关系。除了主 table 的行之外,始终查询所有相关行对性能来说真的很糟糕。当您创建关系映射到模型时,您将不需要在每次需要查询关系时手动编写连接。它们还启用了许多其他反对功能,这需要信息如何在数据库中进行行关系。

要在查询中使用关系映射 Objection.js 要求在每个查询中您必须告诉您要使用 .withGraphFetched.withGraphJoined 方法从主行获取哪些关系 https://vincit.github.io/objection.js/guide/query-examples.html#eager-loading

例如:

class Person extends Model {
  static get tableName() {
    return 'persons';
  }

  static get relationMappings() {
    return {
      pets: {
        relation: Model.HasManyRelation,
        modelClass: Animal,
        join: {
          from: 'persons.id',
          to: 'animals.ownerId'
        }
      }
    };
  }
}


const people = await Person.query().withGraphFetched('pets');

// Each person has the `pets` property populated with Animal objects related
// through the `pets` relation.
console.log(people[0].pets[0].name);
console.log(people[0].pets[0] instanceof Animal); // --> true

当你用.insertGraph插入嵌套对象数据时也使用映射,以便相关对象被插入到相关tables和外键引用等根据关系映射声明自动填充。

还有许多其他地方使用了它们,但我希望这能让您大致了解它们存在的原因。