Итак, я пытаюсь извлечь элементы из отношения соединения в преобразователе 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'],
})
Метод find является одним из нативных методов ТипORM.
Однако я, должно быть, делаю что-то не так, потому что он реагирует так, как будто никакого фильтра нет.
@zenbeni ответил на это :)


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