gpt4 book ai didi

sql - TypeORM 中具有关系目标基类的单表继承

转载 作者:行者123 更新时间:2023-12-05 02:10:46 30 4
gpt4 key购买 nike

在我的应用程序中,我希望用户拥有不同类型的通知项(新闻)。 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(...)
...
}

希望这对某人有帮助。

编辑:

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

关于sql - TypeORM 中具有关系目标基类的单表继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58184454/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com