与bookshelf.js有多个多对多的关系

时间:2016-02-23 06:50:19

标签: node.js orm bookshelf.js

我试图确定使用Bookshelf.js表示以下内容的最佳方式:

我有一个Appointment模型,每个Appointment都有:

  • 1个或更多Pet(s)
  • 1个或更多Service(s)

我可以使用Bookshelf中的多对多关系轻松表示这一点,从而生成三个表:appointmentappointment_petappointment_service

我现在有一项新要求,要求能够在每次约会的基础上指定与每个Service相关联的Pet个,以便与特定宠物相关的服务可能很容易找到。例如:

约会1

  • 有一只宠物
  • 有2项服务(walkwater plants
  • 宠物仅与walk服务相关联。

获取与Pet相关联的Appointment 1的所有服务都会返回walk

是否有使用Bookshelf表示此方案的最佳方式?

1 个答案:

答案 0 :(得分:0)

我认为任何Pet始终与Service相关联。在这种情况下,我会将其结构如下:

ER Diagram

同样,Service模型作为AppointmentPet之间的桥梁。 Service可以有宠物(例如,当它walk}时(例如,当它water plants时)。 BookshelfJS模型看起来像:

var Appointment = bookshelf.Model.extend({
  services: function () {
    return this.hasMany('Service');
  },
  pets: function () {
    return this.hasMany('Pet').through('Service');
  },
});

可能的问题是,您最终会得到许多相同类型的ServiceAppointment,但PetService的组合不同。如果Service上的属性不多,这不会有问题。例如,如果type只有Service属性。

如果您要向price添加更多属性,例如time_durationService等,您可以在自己的表中提取它,如下所示:

ER diagram with Service as a separate table

然后price表将包含每种类型的服务及其属性(例如time_durationvar Appointment = bookshelf.Model.extend({ services: function () { return this.hasMany('Service').through('AppointmentService'); }, pets: function () { return this.hasMany('Pet').through('AppointmentService'); }, }); ,...)。代码看起来像:

{{1}}

我建议选择更简单的情况,然后根据需要改变它。您还可能需要使用withPivot方法从关系表中获取值。