TypeORM getRepository.find() 不包括外键字段

Posted

技术标签:

【中文标题】TypeORM getRepository.find() 不包括外键字段【英文标题】:TypeORM getRepository.find() does not include Foreign Key Fields 【发布时间】:2019-11-20 18:59:42 【问题描述】:

我正在尝试获取我的 entity 中包含的所有列,但我只能获取与其他实体没有任何关系的列。

我使用这个代码块来获取所有行到这个存储库。

private translationTextRepository = getRepository(TranslationText);

async all(request: Request, response: Response, next: NextFunction) 
    return this.translationTextRepository.find();

这是此存储库的entity

@Entity('TranslationText')
export class TranslationText 

    @PrimaryGeneratedColumn()
    ID: number;

    @Column()
    CreatedBy: string;

    @Column( type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' )
    CreatedDate: Date;

    @Column()
    Status: boolean;

    @Column( nullable: true, default: null )
    ModifiedBy: string;

    @Column( type: 'timestamp', nullable: true, default: null )
    ModifiedDate: Date;

    @Column()
    Text: string;

    @ManyToOne((type) => Locale, (locale) => locale.ID)
    @JoinColumn( name: 'LocaleID' )
    LocaleID: Locale;

    @ManyToOne((type) => TranslationTitle, (translationTitle) => translationTitle.ID)
    @JoinColumn( name: 'TranslationTitleID' )
    TranslationTitleID: TranslationTitle;


但我只能获取除LocaleIDTranslationTitleID 之外的所有列。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

查看此文档: https://typeorm.io/#/relations-faq/how-to-use-relation-id-without-joining-relation 解决方案:

    定义新列:

    @column() LocaleID:数字

将旧的重命名为:Locale

但是由于外键问题,typeOrm 无法同步您的表。

    在@ManyToOne(eager: true) 中使用eager 选项

搜索结果将包含关系 Locale 对象,您可以从中获取 id。

【讨论】:

2020 年 12 月,我正要让 #1 工作。我必须做的唯一修改是对不可为空的 ID 列的种子文件。从this.user = context?.userthis.userId = context?.user?.id。定义 id 列优于预先加载或定义关系。仅获取 FK(与所有字段相比)可提高性能。此外,当您尝试保存具有嵌套对象的模型时,完整查询可能会导致错误:服务器可能会尝试覆盖数据库中的那些嵌套对象。明确定义 FK id 可以让您获得最大的控制权。 另外,拥有 id 列使find 更容易一些。比较 let findOpt = where:user:id:'asdf'let findOpt = where: userId: 'asdf' ... await ModelClass.find(findOpt)【参考方案2】:

你能尝试指定这样的关系吗:

async all(request: Request, response: Response, next: NextFunction) 
   return this.translationTextRepository.find(
     relations:["LocaleID","TranslationTitleID"]
    );

因为您必须明确表示您希望查询中的关系。

【讨论】:

以上是关于TypeORM getRepository.find() 不包括外键字段的主要内容,如果未能解决你的问题,请参考以下文章

找不到模块'@nestjs/typeorm'

如何在 TypeOrm 中表示视图?

TypeORM 命令不返回任何内容

NativeScript Angular 与 TypeORM

Typeorm - 基于实体的迁移

TypeORM 中文网