在 TypeORM 中使用外键查找行
Find rows using foreign key in TypeORM
我有一个从 User
到 Message
的 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[];
}
我有一个从 User
到 Message
的 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[];
}