TypeORM - Получить данные через запрос отношения в распознавателе - PullRequest
0 голосов
/ 22 апреля 2019

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

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

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

//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'],
      })

enter image description here

Метод поиска одиниз TypeORM нативных методов.

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

1 Ответ

0 голосов
/ 25 апреля 2019

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

Таким образом, чтобы получить Уведомление, вы перейдете по 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)

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

...