TypeORM - получение данных через запрос отношения в распознавателе

Итак, я пытаюсь извлечь элементы из отношения соединения в преобразователе Apollo.

У меня есть таблица пользователей, таблица уведомлений. И таблица отношений с именем:

notification_recipients_user определяется отношением ManyToMany для обоих объектов, но размещается в Notification:

//entity/Notification.ts
  @ManyToMany(type => User, recipient => recipient.notifications)
  @JoinTable()
  recipients: User[];

Я могу без проблем создать отношение с помощью этой мутации:

    addNotificationForUser: async (_, { id, data }) => {
      const user = await User.findOne({ id });
      if (user) {
        const notification = await Notification.create({
          template: data,
          recipients: [user]
        }).save()
        return notification;
      } else {
        throw new Error("User does not exists!");
      }
    }

Однако мне совершенно не удается получить данные для конкретного пользователя.

    allNotificationsOfUser: (_, { user }, ___) => {
      return Notification.find({
        where: { userId: user },
        relations: ['recipients'],
      })

TypeORM - получение данных через запрос отношения в распознавателе

Метод find является одним из нативных методов ТипORM.

Однако я, должно быть, делаю что-то не так, потому что он реагирует так, как будто никакого фильтра нет.

Вы только что вставили несколько уведомлений? Не уверен, что ваша проблема связана с прочитанной частью. Часть создания создаст экземпляр нового объекта (не извлеченного из старого значения из базы данных), поэтому есть вероятность, что вы каждый раз вставляете новый элемент, получая несколько значений в базе данных. Используйте необработанный SQL-запрос выбора, чтобы проверить это.

zenbeni 22.04.2019 11:42

@zenbeni ответил на это :)

Baldráni 25.04.2019 19:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
2
1 158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, лучший способ сделать это - использовать отношение между объектами.

Итак, чтобы получить уведомление, вы пойдете по User.notifications

allUnseenNotificationsOfUser: async (_, { userId }, __) => {
  const user = await User.findOne({
    relations: ["notifications"],
    where: { id: userId }
  });
  if (user) {
    const notifications = user.notifications.filter(notification => !notification.seen)
    return notifications;
  }
  return null;
}

И для записи для тех, кто наткнется на это, вы можете использовать фильтр для своего результата, чтобы выполнить запрос, например преобразователь.

const notifications = user.notifications.filter(notification => !notification.seen)

Это кажется сложным, но работает как шарм.

Другие вопросы по теме