Я настраиваю NestJS GraphQL API, который использует TypeORM, и у меня возникают проблемы с реализацией отношений между сущностями.
В частности, отношения TypeORM работают отлично, и сущности правильно связываются в базе данных. Однако проблема возникает, когда я пытаюсь запросить API, чтобы получить результаты.
Прямо сейчас у меня есть 2 объекта, у каждой из которых есть собственный преобразователь: Пользователи и Фотографии. У каждого пользователя может быть несколько фотографий, в то время как каждая фотография связана только с одним пользователем (многие к одному).
Фото-объект, имеющий отношение к пользовательскому объекту
@ManyToOne(type => User, user => user.photos, {
onDelete: 'CASCADE',
})
@JoinColumn()
user: User;
Пользовательский объект, завершающий подключение к фото-объекту
@OneToMany(type => Photo, photo => photo.user, {
eager: true,
})
photos: Photo[];
Сопоставитель пользователей
@ResolveProperty('photos')
async photos(@Parent() user): Promise<Photo[]> {
return await this.service.readPhotos(user.id);
}
Пользовательское обслуживание
async readPhotos(userId): Promise<Photo[]> {
return await this.photoRepository.find({
where: {
user: userId
}
});
}
* Обратите внимание, что фоторепозиторий можно фильтровать по полю «пользователь». *
Фото резолвер
@ResolveProperty('user')
async user(@Parent() photo): Promise<User> {
console.info(photo);
return await this.service.readUser(photo.user);
}
Этот преобразователь фотографий, похоже, содержит проблему; объект фотографии, выводимый консолью, указывает на то, что хотя объекту фотографии @Parent доступны все его статические поля (например, ID, datePublished, URL), по какой-то причине фактическое поле «пользователь» здесь недоступно. Значит, переменная photo.user равна нулю. * Обратите внимание, что это, по-видимому, указывает на то, что фоторепозиторий НЕВОЗМОЖНО фильтровать / получать доступ к полю «пользователь». *
Фото сервис
async readUser(userId): Promise<User> {
return await this.userRepository.findOne({
where: {
user: userId
}
});
}
Это возвращает значение null, поскольку идентификатор пользователя пуст, поскольку предыдущий преобразователь фотографий не может получить доступ к полю «пользователь».
Почему преобразователь фотографий не может получить доступ к полю @Parent photo 'пользователь'? Служба User, кажется, может легко фильтровать по полю «пользователь», но я не могу напрямую получить доступ к полю «пользователь» фотографии.
Спасибо за любую помощь в этом вопросе! Я был в тупике по этому поводу последние два дня ...





Итак, вы хотите получить доступ к пользователю, да? photo.user? В FindOptions есть ключ, называемый «отношения», который он будет извлекать и применять за вас. Итак, в вашем примере
async readPhotos(userId): Promise<Photo[]> {
return await this.photoRepository.find({
where: {
user: userId
},
relations: ['user'],
});
}
Теперь это должен быть photo.user. Другой способ был бы наоборот
async readUser(userId): Promise<User> {
return await this.userRepository.findOne({
where: {
user: userId
},
relations: ['photos'],
});
}
Теперь это должно вернуть user.photos как массив Photo.
Вы можете найти больше примеров использования FindOptions здесь http://typeorm.io/#/find-options
Надеюсь это поможет!
Я боролся с аналогичной проблемой, и хотя решение @bashleigh работает, если вы хотите, чтобы весь объект был возвращен, мне нужен был только идентификатор. Так что, если это ваш случай, вы можете передать опцию loadRelationIds и установить ее на true.
return await this.photoRepository.find({
where: {
id: photoId
},
loadRelationIds: true
});
Это вернет пользователя только как идентификатор (строка или целое число).
Можете ли вы поделиться своей схемой GraphQL? В частности, определения для вашей фотографии и пользователя