postgresql 在TypeORM中使用外键查找行

plicqrtu  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(193)

我有一个从UserMessage的一对多关系。
当我插入register一个带有消息的用户时,它会将用户添加到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[];
}

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实体中。
但是在这种情况下我们如何查询它呢?

tzdcorbm

tzdcorbm1#

正如这篇文章中提到的,你必须在你的manytoone后面添加装饰器@JoinColumn,这样就可以连接列,你就可以用它来执行你想要的查询了:

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

请注意,这只适用于像id这样的主列。
您的消息表将是:

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

  @Column()
  text: string;

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

k2arahey2#

我能够做到这一点与以下querybuilder。

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();

相关问题