【问题标题】:Is it possible to make hasMany relations behave like actual properties in LoopBack 4是否可以让 hasMany 关系表现得像 LoopBack 4 中的实际属性
【发布时间】:2019-06-09 18:07:47
【问题描述】:

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

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

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

另一方面,我想发布和修补事件而不单独发布和修补事件日期——这可以通过几行代码来实现吗?

这是我现在需要在 /events 下提供日期字段(似乎不是正确的方式):

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

【问题讨论】:

    标签: javascript loopbackjs


    【解决方案1】:

    虽然我可以使用 eventRepository.dates(eventId) 查询日期,但当我请求 http://localhost:3000/events 时不可用 – 如果不单独询问 eventRepository.dates(eventId),我怎么能做到这一点?

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

    另一方面,我想发布和修补事件而不单独发布和修补事件日期——这可以通过几行代码来实现吗?

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

    这是我现在需要在 /events 下提供日期字段(似乎不是正确的方式)。

    您的解决方案容易受到所谓的“选择 1+N 问题”的影响(参见例如 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 中实现的要点。

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

    【讨论】:

    • 非常感谢您的回复,我想我可以应付。
    • 您说,您认为 LoopBack 永远不会支持在单个请求中更新资源及其关系——这里的最佳实践是什么?当我的表单结合了事件数据和日期时,我是否需要向两个不同的端点发出不同的 POST 请求?当我使用@property.array 而不是@hasMany 时,它会完成我希望自己做的所有事情。唯一的事情是......它将相关的 EventDates 存储在单个数据库字段中,这不像我想要的那样干净。
    • > 当我使用@property.array 而不是@hasMany 时,它会完成我希望自己做的所有事情。唯一的事情是......它将相关的 EventDates 存储在单个数据库字段中,这不像我想要的那样干净
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2020-10-10
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多