如何从NestJS / TypeORM

时间:2019-01-12 20:12:36

标签: node.js graphql nestjs typeorm

我正在建立一个使用TypeORM的NestJS GraphQL API,并且在实现实体之间的关系时遇到麻烦。

特别是,TypeORM关系运行良好,并且实体在数据库中正确链接。但是,当我尝试查询API以获取结果时会出现问题。

现在我有2个实体,每个实体都有自己的解析器:Users和Photos。每个用户可以拥有多张照片,而每张照片仅连接到一个用户(多对一)。

这是实体与TypeORM链接的方式

照片实体,与用户实体有关系

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

* 请注意,photoRepository可以通过“用户”字段进行过滤。 *

但是,此代码不起作用。它应该让我们查看哪个用户已连接到照片,而是返回null。

照片解析器

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

此照片解析器似乎包含此问题;控制台输出的照片对象表示,虽然@Parent照片对象具有其所有静态字段(例如ID,datePublished,URL),但由于某种原因,此处无法访问实际的“用户”字段。因此,“ photo.user”变量为null。 * 请注意,这似乎表明photoRepository无法被'用户'字段过滤/访问。 *

照片服务

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

由于先前的Photo解析器无法访问“用户”字段,因此由于userId为空,因此返回null。

结论

为什么照片解析器不能访问@Parent照片的“用户”字段?用户服务似乎可以按“用户”字段进行过滤,但是我似乎无法直接访问“照片”用户字段。

谢谢您的帮助!最近两天我一直为此感到困惑...

2 个答案:

答案 0 :(得分:1)

因此,您想访问用户吗? 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'],
    });
}

现在应该以{{1​​}}的数组形式返回user.photos

您可以在http://typeorm.io/#/find-options

处找到Photo用法的更多示例。

希望这会有所帮助!

答案 1 :(得分:0)

我正在努力解决类似的问题,尽管@bashleigh的解决方案可以工作,但如果您希望返回整个实体,我只需要id。因此,如果是这种情况,您可以传递loadRelationIds选项,并将其设置为true

return await this.photoRepository.find({
 where: {
  id: photoId
 },
 loadRelationIds: true
});

这将以id(字符串或整数)的形式返回用户。