是否可以让hasMany关系表现得像LoopBack 4中的实际属性

时间:2019-06-09 18:07:47

标签: javascript loopbackjs

我正在使用LoopBack 4构建API。是否可以像实际属性一样使用关系?

API将事件(例如音乐会)存储在数据库的事件表中,并将事件日期存储在event_dates表中。我已经使用此[1]指令成功将hasMany关系添加到Event模型,并将Eventsate模型添加到EmiratesTo关系(一个Event可以具有多个EventDate)。

虽然我可以使用eventRepository.dates(eventId)查询日期,但是当我请求http://localhost:3000/events时却无法使用–如何在不单独询问eventRepository.dates(eventId)的情况下实现这一点?

另一方面,我想发布和修补事件,而不必分别发布和修补事件日期–几行代码是否可以实现?

这就是我现在需要使/ events下的date字段可用的方法(似乎不是正确的方法):

const events = await this.eventRepository.find(filter);
for (let event of events) {
   event.dates = await this.eventRepository.dates(eventId).find()
}

当我想添加新事件时,我需要这样做:

POST /events
POST /events/:id/event-dates
POST /events/:id/event-dates
...

请注意:我正在寻找LoopBack框架中已经可用的解决方案。实现这些问题不是问题,我只是希望它尽可能短并且易于维护。

[1] https://loopback.io/doc/en/lb4/HasMany-relation.html

1 个答案:

答案 0 :(得分:0)

  

虽然我可以使用eventRepository.dates(eventId)查询日期,但是当我请求http://localhost:3000/events时却无法使用–如何在不单独询问eventRepository.dates(eventId)的情况下实现这一点?

我们称此功能为“包含相关模型”,很遗憾,尚未实现。您可以在此处跟踪进度:https://github.com/strongloop/loopback-next/issues/1352

  

另一方面,我想发布和修补事件,而不必分别发布和修补事件日期–几行代码是否可以实现?

如果我对您的理解正确,那么您希望通过单个REST API调用来更新EventEventDate实例。我们不支持该功能,说实话,我不确定是否会。

  

这就是我现在需要使/ events下的date字段可用的方法(似乎不是正确的方法)。

您的解决方案容易受到所谓的“ SELECT 1 + N PROBLEM”(例如What is the "N+1 selects problem" in ORM (Object-Relational Mapping)?)的攻击。如果您的活动有N个日期,那么您将进行1 + N个数据库查询。

更好的解决方案是利用LoopBack的inq运算符:

const eventIds = events.map(e => e.id);
const dates = await this.datesRepository.find({where:{eventId:{inq: eventIds}}});
// copy "dates" entries to relevant "event" items
// by matching "dates[].eventId" against "events[].id"

如果查询的事件数量很多,则需要将eventIds数组拆分为较小的块,并多次调用this.datesRepository.find

无论如何,这就是我们不久将在LoopBack中实现的要旨。

由于您正在寻找已经在框架中实现的解决方案,因此您发布的代码段几乎就是如此。