如何解决TypeORM 一对一关系:在任一侧都找不到实体列?
我的 postgreSQL 数据库包含三个实体:
@Entity()
export class User {
constructor(email: string,displayname: string,passwordHash: string,salt: string) {
this.email = email
this.displayname = displayname;
this.passwordHash = passwordHash;
this.salt = salt;
}
@PrimaryColumn()
email!: string;
@Column()
passwordHash!: string;
@Column()
displayname!: string;
@Column()
salt!: string;
@OneToOne(type => Cafe,Cafe => Cafe.owner,{cascade: true})
cafe!: Cafe;
}
@Entity()
export class Cafe {
@PrimaryGeneratedColumn()
id!: number;
//TESTING
@Column()
name!: string;
@OneToOne(type => User,User => User.cafe)
owner!: User;
@OneToOne(type => Gamestate,Gamestate => Gamestate.cafe,{ cascade: ["insert","remove","soft-remove","recover"] })
gamestate!: Gamestate;
}
@Entity()
export class Gamestate {
@PrimaryGeneratedColumn()
id!: number;
@Column()
name!: string;
@OneToOne(type => Cafe,Cafe => Cafe.gamestate)
cafe!: Cafe;
public update(): void {
//TODO: do update Logic here
}
}
当创建一个填充了 cafe 和 gamestate 的用户时,它们会正确地级联到数据库中。 但是当我尝试通过
找到游戏状态时const foundGamestate = await connection.getRepository(Gamestate).find({ where: { cafe: { name: "Test" } }});
我收到一个错误:
EntityColumnNotFound: No entity column "cafe" was found.
即使在尝试找咖啡馆之后,错误仍然存在,所以似乎双方实际上都没有一对一的关系?
const foundCafe = await connection.getRepository(Cafe).find({ where: { gamestate: { name: "Test" } }});
EntityColumnNotFound: No entity column "gamestate" was found.
是我的实体设置错误,还是我使用 find/where 错误?
解决方法
更新:
使用 find
方法时,typeorm 目前不允许在相关实体的属性上添加 where 条件。
有 2 个未解决的问题可以处理此行为,一旦其中一个问题得到解决,以下答案将起作用:
问题:
您错过了在一对一关系的一侧添加所需的 @JoinColumn()
注释。有关详细信息,请参阅 this article。
更新您的 Cafe
实体如下:
@Entity()
export class Cafe {
@PrimaryGeneratedColumn()
id!: number;
//TESTING
@Column()
name!: string;
@OneToOne(type => User,user => user.cafe)
@JoinColumn()
owner!: User;
@OneToOne(type => Gamestate,gamestate => gamestate.cafe,{ cascade: ["insert","remove","soft-remove","recover"] })
@JoinColumn()
gamestate!: Gamestate;
}
然后使用以下语法进行查询:
const foundGamestate = await connection.getRepository(Gamestate).find({
relations: ["cafe"],where: { cafe: { name: "Test" } }
});
希望对你有帮助。干杯?!
,这花了我一些时间来弄清楚。 关系部分: |
return this.messageRepository.find({ relations: ['user','sender'] })
@OneToOne(() => User)
@JoinColumn({ name: "userId" })
user: User;
@OneToOne(() => User)
@JoinColumn({ name: "senderId" })
sender: User;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。