Как получить доступ к идентификатору взаимосвязи из присоединенного поля Родителя в NestJS / TypeORM - PullRequest
0 голосов
/ 12 января 2019

Я устанавливаю NestJS GraphQL API, который использует TypeORM, и у меня возникают проблемы с реализацией отношений между сущностями.

В частности, отношения TypeORM работают отлично, и сущности правильно связываются в базе данных. Однако проблема возникает, когда я пытаюсь запросить API, чтобы получить результаты.

Сейчас у меня есть 2 объекта, каждый со своим собственным распознавателем: пользователи и фотографии. Каждый пользователь может иметь несколько фотографий, в то время как каждая фотография подключена только к одному пользователю (многие-к-одному).

Вот как сущности связаны с TypeORM

Photo Entity, со связью с User Entity

@ManyToOne(type => User, user => user.photos, {
    onDelete: 'CASCADE',
})
@JoinColumn()
user: User;

Пользовательский объект, завершающий соединение с Photo Entity

@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
        }
    });
}

* Обратите внимание, что photoRepository может быть отфильтрован по полю пользователя. *

Этот код, однако, не работает. Это должно позволить нам посмотреть, какой пользователь подключен к фотографии, вместо этого он возвращает ноль.

Разрешение фотографий

@ResolveProperty('user')
async user(@Parent() photo): Promise<User> {
    console.log(photo);
    return await this.service.readUser(photo.user);
}

Кажется, в этом преобразователе фотографий есть проблема; объект photo, выводимый консолью, указывает на то, что, хотя у объекта photo @Parent имеются все его статические поля (например, ID, datePublished, URL), по какой-то причине фактическое поле пользователя здесь недоступно. Таким образом, переменная photo.user равна нулю. * Обратите внимание, что это, похоже, указывает на то, что photoRepository НЕДОПУСТИМО, чтобы отфильтровать через / получить доступ к полю 'user'. *

Фотоуслуги

async readUser(userId): Promise<User> {
    return await this.userRepository.findOne({
        where: {
            user: userId
        }
    });
}

Возвращает значение NULL, поскольку userId пуст, поскольку предыдущий преобразователь фотографий не может получить доступ к полю 'user'.

Заключение

Почему преобразователь фотографий не может получить доступ к полю @Parent photo user? Похоже, что пользовательский сервис может нормально фильтровать по полю «пользователь», но я не могу напрямую получить доступ к полю «Пользователь» фото.

Спасибо за любую помощь в этом! Я был в тупике за последние два дня ...

1 Ответ

0 голосов
/ 15 января 2019

Итак, вы хотите получить доступ к пользователю? 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 s

.

Вы можете найти больше примеров использования FindOptions здесь http://typeorm.io/#/find-options

Надеюсь, это поможет!

...