在 TypeORM 中使用外键查找行

Sea*_*ean 6 postgresql typeorm nestjs

User我有一个从到 的OneToMany 关系Message

当我使用消息插入注册用户时,它将用户添加到表中User,并将消息添加到Message表中并userId指向用户的 id。

这是使用以下设置自动完成的。

User实体:

@Entity()
export class User {
  @PrimaryGeneratedColumn() 
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;

  @JoinTable()
  @OneToMany((type) => Message, (message) => message.user, {
    cascade: true,
  })
  messages: Message[];
}
Run Code Online (Sandbox Code Playgroud)

Message实体:

@Entity()
export class Message {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  text: string;
  @ManyToOne((type) => User, (user) => user.messages, { eager: true })
  user: User[];
}
Run Code Online (Sandbox Code Playgroud)

如果我想通过以下方式查找来自用户的所有消息userId

const existing_msgs = await this.messageRepository.find({
    where: { userId: user.id },
});
Run Code Online (Sandbox Code Playgroud)

它告诉我它找不到该userId列,这是可以理解的,因为我没有专门包含userIdMessage实体。

但在这种情况下我们该如何查询呢?

Ale*_*exy 8

正如这篇文章中提到的,您必须在 Manytoone 之后添加装饰器 @JoinColumn。这将加入该列,您将能够使用以下命令执行您想要的查询:

const existing_msgs = await this.messageRepository.find({
    where: { user: { id: user.id }},
});
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于 id 等主列。

你的消息表将是:

@Entity()
export class Message {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  text: string;

  @ManyToOne((type) => User, (user) => user.messages, { eager: true })
  @JoinColumn() // <-- Add this
  user: User[];
}
Run Code Online (Sandbox Code Playgroud)