在 TypeORM 中使用外键查找行

Find rows using foreign key in TypeORM

我有一个从 UserMessage 的 OneToMany 关系。

当我插入使用消息注册用户时,它会将用户添加到 User table,并将消息添加到 Message table 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[];
}

Message实体:

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

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

如果我想通过 userId 查找来自用户的所有消息:

const existing_msgs = await this.messageRepository.find({
    where: { userId: user.id },
});

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

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

我能够使用以下查询生成器来完成。

        const msg_arr = await this.userRepository
          .createQueryBuilder('user')
          .leftJoinAndSelect('user.messages', 'messages')
          .where('user.id = :userId', { userId: user.id })
          .andWhere('messages.text LIKE :text', { text: message })
          .select('messages.text')
          .execute();

This post中所述,您必须在manytoone 之后添加装饰器@JoinColumn。这将加入列,您将能够执行您想要的查询:

const existing_msgs = await this.messageRepository.find({
    where: { user { id: user.id }},
});

请注意,这仅适用于像 id 这样的主列。

您的消息 table 将是:

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

  @Column()
  text: string;

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