在我的应用中,我希望用户拥有不同类型的通知项(新闻)。 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会在type
表的SQL定义中创建一个称为news_item
的列-但此列在NewsItem
类本身上不可用,我不能了解如何构建实际上会给我ConcreteNewsItem
对象的查询!
答案 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实际上使用了具体的类构造函数。