TypeORM 插入与relationId

Posted

技术标签:

【中文标题】TypeORM 插入与relationId【英文标题】:TypeORM insert with relationId 【发布时间】:2020-04-22 08:51:52 【问题描述】:

我使用 TypeORM,只是我想使用 relationId 插入一行。但它并没有像我预期的那样工作。

这是我的实体:

@Entity()
export default class Address extends BaseEntity 

    @Column(
        type: 'varchar',
        length: 255,
    )
    public title: number;

    @Column(
        type: 'varchar',
        length: 2000,
    )
    public value: number;

    @ManyToOne(type => User, user => user)
    @JoinColumn( name: 'userId' )
    public user: User;

    @RelationId((address: Address) => address.user)
    public userId: number;


当我尝试像下面的示例一样添加时,它会添加 null userId 我没想到


    "title": "My home address",
    "value": "Lorep Ipsum Sit Amet",
    "userId": 4


当我更改有效负载时,一切正常。


    "title": "Ev adresim",
    "value": "Nova Suites",
    "user": 4

我不想使用像上面这样的有效负载。我沉迷于定义一个描述性的变量命名。感谢您从现在开始的所有贡献和所有回答。

【问题讨论】:

【参考方案1】:

看起来这是 @RelationId 装饰器的 TypeORM 问题:https://github.com/typeorm/typeorm/issues/3867。

您可以使用@Column 来装饰 userId,而不是使用@RelationId,当 JoinColumn 的名称等于数字列名称时,TypeORM 匹配两者,您可以设置 userId 或用户,TypeORM 将处理它:

@ManyToOne(type => User, user => user)
@JoinColumn( name: 'userId' )
public user: User;

@Column()
public userId: number;

【讨论】:

感谢朋友的回答。实际上,我曾尝试过此解决方案,但没有奏效。它给了我一个错误 error: Error: UNKNOWN_CODE_PLEASE_REPORT: Referencing column 'userId' and referenced column 'id' in foreign key constraint 'FK_d25f1ea79e282cc8a42bd616aa3' are incompatible. 我也删除了表格,但它没有按我预期的那样工作。这意味着它不会自动添加外键 我检查了终端所说的错误。我意识到,当我们定义 userId 列的属性时,与引用表的 Id 相同。它工作正常。您能否根据此更新您的答案。当您更新答案时,我将标记您的答案。因此,面临同样问题的人也能够找到他们的问题。应该是这样的 --> @Column( type: 'integer', unsigned: true, ) public userId: number; 因为在我的基实体类中,我将主 ID 定义为无符号 好的,很高兴我能帮上忙。我更新了答案,但我不是 100% 确定你的意思。【参考方案2】:

@RelationId 装饰器朝一个方向工作。 写在documentation:

将特定关系的 id(或多个 id)加载到属性中。

关系 id 仅用于表示。链接值时不会添加/删除/更改基础关系。

按照建议,您可以使用 @Column 装饰器来更新值。

【讨论】:

你完全正确。实际上,@JudgeFudge 给出的答案几乎是正确的。我已经评论了一些部分。当他/她更改她/他的答案时,我将批准该答案。 @HalilİbrahimÖzdoğan 你的问题变了吗?我给出的答案不相关?你是怎么解决这个问题的? 不,你的答案也很相关。这就是为什么我也赞成你的回答。【参考方案3】:

正如 Noam 所指出的,您不能使用 @RelationId() 装饰属性来分配关系。相反,您应该使用关系本身。

如果你有一个像下面user 这样的对象的实例,你可以直接传递它。对于我只有 ID 的报价,我可以通过创建一个只有 id 属性的对象来解决这个限制。现在我不必从数据库中检索整个对象,这会浪费资源。

subscriptionRepository
    .insert(
        offer: id: offerId,
        user: user,
    )

供您参考,这是我的实体定义的摘录。

@Entity()
export class Subscription 
    @PrimaryGeneratedColumn()
    id: number;

    @ManyToOne(
        () => Offer,
        (offer: Offer) => offer.subscriptions
    )
    offer: Offer;

    @ManyToOne(
        () => User,
        (user: User) => user.subscriptions
    )
    user: User;

【讨论】:

以上是关于TypeORM 插入与relationId的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 typeorm (NestJS) 在 SQL Server 中插入 bigint

如何在 TypeORM 中使用具有自动递增 id 列的表进行级联插入

如何插入多个实体并在 TypeORM 中返回它们

TypeORM - 运行服务器时自动填充表

播种时NestJS中的TypeOrm:RepositoryNotFoundError

TypeORM 是不是支持输入和输出的原始 SQL 查询?