Можно ли заставить отношения hasMany вести себя как реальные свойства в LoopBack 4? - PullRequest
0 голосов
/ 09 июня 2019

Я создаю API с помощью LoopBack 4. Можно ли использовать отношения, как если бы они были фактическими свойствами?

API сохраняет события (например, концерты) в таблице событий в базе данных и даты событий втаблица event_dates.Я успешно добавил отношение hasMany к модели Event и отношение ownTo к модели EventDate (одно событие может иметь несколько дат EventDate) с помощью этой [1] инструкции.

Хотя я могу запрашивать даты, используя eventRepository.dates (eventId), они недоступны, когда я запрашиваю http://localhost:3000/events - Как я могу добиться этого, не запрашивая eventRepository.dates (eventId) отдельно?

С другой стороны, я бы хотел, чтобы события POST и PATCH не публиковались и не фиксировали даты событий отдельно - возможно ли это с помощью нескольких строк кода?

Это то, что мне нужно сделатьполе даты, доступное прямо сейчас под / 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

1 Ответ

0 голосов
/ 17 июня 2019

Хотя я могу запрашивать даты, используя eventRepository.dates (eventId), они недоступны, когда я запрашиваю http://localhost:3000/events - Как я могу добиться этого, не запрашивая eventRepository.dates (eventId) отдельно?

Мы называем эту функцию «включением связанных моделей», и, к сожалению, она еще не реализована.Вы можете отслеживать прогресс здесь: https://github.com/strongloop/loopback-next/issues/1352

С другой стороны, я бы хотел, чтобы события POST и PATCH не публиковали и не фиксировали даты событий отдельно. Возможно ли это с помощью нескольких строк кода?

Если я правильно вас понял, вы бы хотели обновить оба экземпляра Event и EventDate с помощью одного вызова REST API.Мы не поддерживаем эту функциональность и, честно говоря, я не уверен, что когда-либо будем.

Это то, что мне нужно, чтобы поле даты было доступно в разделе / ​​events прямо сейчас (некажется, что это правильный путь).

Ваши решения уязвимы к так называемой «проблеме выбора 1 + N» (см., например, Что такое «проблема выбора N + 1» в ORM(Объектно-реляционное отображение)? ).Если ваше событие имеет 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"

Если количество запрошенных событий равноhigh, тогда вам нужно будет разбить массив eventIds на более мелкие куски и несколько раз вызвать this.datesRepository.find.

В любом случае, это суть того, что мы собираемся реализовать в LoopBack в ближайшем будущем.

Поскольку вы ищете решение, которое уже реализовано во фреймворке, фрагменты кода, которые вы опубликовали, в значительной степени такие.

...