在我的应用程序中,我希望用户具有不同类型的通知项(新闻(。User
和NewsItem
必须具有一对多关系,而且,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实际上使用了具体的类构造函数。