TypeORM中具有关系定位基类的单表继承

时间:2019-10-01 12:07:45

标签: sql node.js typescript typeorm single-table-inheritance

在我的应用中,我希望用户拥有不同类型的通知项(新闻)。 UserNewsItem必须具有一对多关系,但是NewsItem只是不同类型的实际新闻项目的基类。

这是我的基础NewsItem班:

@Entity()
@TableInheritance({ column: { type: "varchar", name: "type"}})
export class NewsItem {

    @PrimaryGeneratedColumn()
    id: number;

    @ManyToOne(type => User, user => user.news)
    receiver: Promise<User>;

}

这是它附带的User

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    // (a lot of irrelevant stuff removed)

    @OneToMany(type => NewsItem, newsItem => newsItem.receiver)
    news: Promise<NewsItem[]>;

}

这是一个具体新闻示例:

@ChildEntity()
export class ConcreteNewsItem extends NewsItem {

    @Column()
    someData: number;
}

从文档看来,这一切都足够直观。但是,这是我没有得到的:如何浏览用户的news,检查每个用户的确切类型,并为每个用户获取具体新闻类型的对象?

据我了解,TypeORM会在type表的SQL定义中创建一个称为news_item的列-但此列在NewsItem类本身上不可用,我不能了解如何构建实际上会给我ConcreteNewsItem对象的查询!

1 个答案:

答案 0 :(得分:1)

旧问题,但仍未回答。我找到了一个比较优雅的解决方案。 实际上,TypeORM查询实体的具体类型。通过将构造函数名称与类名称进行比较,您可以知道查询结果实体是哪种具体类型。就是这样:

const allNews = await repository.find(); //Repository pattern for the query
for (const news in allNews) {
   if (news.constructor.name == ConcreteNewsItem.name){
       const concreteNews = news as ConcreteNewsItem; //This cast is safe
   }
   else if(...)
   ...
}

希望这对某人有帮助。

编辑:

更好的是,您可以使用instanceof,并且它有效,因为TypeORM实际上使用了具体的类构造函数。

相关问题