NestJs 在给定 id 的情况下创建关系

NestJs create relation given the id

提问人:Thiago Dias 提问时间:11/13/2023 更新时间:11/13/2023 访问量:18

问:

我有 2 个实体:和 .一篇文章由一个用户创建,但一个用户可以创建多篇文章。它们各自的实体定义如下:UserArticle

export class Article {
    id?: string; // Optional to allow db to generate id
    // ...
    user?: User;
}

export class User {
    id?: string;
    username: string;
    password: string;
}

我已按照 NestJs 文档将实体与其模式分开。 应具有与 相关的列。这是在架构的一部分中定义的。我没有指定列,只在关系中指定。ArticleuserIdUserrelationsuserId

export const ArticleSchema = new EntitySchema<Article>({
    name: 'Article',
    target: Article,
    tableName: 'Article',
    columns: {
        id: {
            type: String,
            primary: true,
            generated: 'uuid',
        },
        // ...
    },
    relations: {
        user: {
            type: 'many-to-one',
            target: 'User',
            nullable: false,
            joinColumn: {
                name: 'userId',
            },
        },
    },
});

在我的控制器中,我收到一个:CreateArticleDto

export class CreateArticleDto {
    // ...
    @IsUUID()
    userId: string;
}

我知道默认情况下,TypeORM 会在我们指定关系并传递 ,在我的情况下是 .但是,在我的控制器中,我只能访问 .我想创建一个而无需搜索实体。relatedEntityIdentityuser: UseruserIdArticleUser

目前,我必须创建一个空用户(仅具有 id)将其传递给服务,然后使用该用户搜索该用户并将其保存在 Article 中,以便将 Article 保存到数据库中:id

控制器

const article: Article = {
    ...createArticleDto,
    user: {
        id: createArticleDto.userId,
        username: '',
        password: '',
    },
};
const result = await this.articleService.create(article);

服务

async create(article: Article) {
    const user = await this.userService.getById(article.user.id);
    article.user = user;
    const result = await this.articleRepository.create(article);
    return result;
}

有没有更好的方法?理想情况下,仅使用 userId 创建新文章。

打字稿 nestjs typeorm 多对一

评论

0赞 Thiago Dias 11/13/2023
我的问题与类似。但是,由于在需要更多属性的文章中键入 User,因此无法在我的代码库中实现,它可以用作最后的手段,但它看起来不像预期的方式。

答:

0赞 Thiago Dias 11/13/2023 #1

经过更多的研究,我能够找到这个晦涩难懂的文档。 虽然这似乎是一种解决方法,但我认为没有其他方法可以做到这一点。

2017 年开始在 typeorm 存储库中讨论此功能。在架构和实体中重复 感觉是错误的,有点奇怪,但这比执行不必要的数据库查找要好。relationEntityId

评论

0赞 Thiago Dias 11/13/2023
这样做在我的代码中引入了一个新错误。IDK 如果是 typeorm 的错或我的错:未解决的相关问题