【问题标题】:TypeORM relationship: Only IDs instead of whole instancesTypeORM 关系:只有 ID 而不是整个实例
【发布时间】:2020-01-20 21:32:59
【问题描述】:

根据documentation,在TypeORM中一个关系定义如下: 用户只有一个配置文件。

import {Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn} from "typeorm";
import {Profile} from "./Profile";

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @OneToOne(type => Profile)
    @JoinColumn()
    profile: Profile;

}

问题

创建新用户时,为什么我必须传递实体的完整实例(profile: Profile),而不是像往常一样只传递一个 ID?像这样:

@OneToOne(type => Profile)
    @JoinColumn()
    profileId: number;

就没有别的办法了吗?

如果您必须对 4 个外键进行 4 次查询以获取相应的实例而不是 ID,则此过程会导致大量不必要的开销。

如果能帮助我解决这个问题,我将不胜感激!

【问题讨论】:

    标签: foreign-keys relationship typeorm


    【解决方案1】:

    在 TypeORM 中,导航字段(此处为 profile)可以与普通外键字段(profileId)结合使用。所以你可以写:

    @Entity()
    export class User {
    
        @PrimaryGeneratedColumn()
        id: number;
    
        @Column()
        name: string;
    
        @OneToOne(type => Profile)
        @JoinColumn()
        profile: Profile;
    
        @Column()
        profileId: number;
    
    }
    

    然后由您决定是更新与实体对象的关系还是仅使用配置文件 ID。

    【讨论】:

    • 非常简单,但它确实有效 - 非常感谢,这对我有很大帮助!但这不在文档中,是吗?在这一点上,我发现 TypeORM 剥夺了太多的控制权,并且在后台做了一些不太明显和预期的事情。
    • 在稍微不同的上下文中提到了here。您对 TypeORM 抽象/隐藏了很多东西的担忧是对的,结果有时是不可预见的,但主要是阅读源代码可以澄清事情。
    • 你们知道我是否可以与 ID 类型为 String (varchar) 的实体建立关系吗??
    • 配置文件被删除后会发生什么? profileId 未为空。
    猜你喜欢
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2020-09-28
    • 2020-06-20
    • 2014-12-11
    • 1970-01-01
    相关资源
    最近更新 更多