在 TypeORM 中具有面向基类的关系的单个表继承



在我的应用程序中,我希望用户具有不同类型的通知项(新闻(。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 将在news_item表的 SQL 定义中创建一个名为type的列 - 但该列NewsItem类本身不可用,我不明白如何构建一个查询,实际上会给我ConcreteNewsItem对象!

老问题,但仍未得到解答。我为此找到了一个优雅的解决方案。 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(...)
...
}

希望这对某人有所帮助。

编辑:

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

最新更新