我正在使用 TypeORM 和 MySQL 来玩 NestJs。
我已经查看了文档,并且我已经在本地运行了基本的 CRUD 应用程序。 我已经通过 id 内置了搜索(通过存储库),但我还需要通过自定义列实现搜索。
例如我有这个实体:
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
username: string;
@Column()
first_name: string;
@Column()
last_Name: string;
@Column()
gender: string;
在我的存储库中,我有这些内置方法:
async findAll(): Promise<User[]> {
return this.usersRepository.find();
}
findOne(id: string): Promise<User> {
return this.usersRepository.findOne(id);
}
正如预期的那样,它工作得很好。我需要另一个自定义搜索,这样我也可以通过用户名进行搜索,我怎样才能实现这一点? 我需要这样的东西:
findByUsername(username: string): Promise<User> {
return this.usersRepository.findByUsername(username);
}
我假设我必须实现自定义查询,但我不知道在哪里执行:(
这是更简单的解决方案:
findByUsername(username: string): Promise<User | undefined> {
return this.usersRepository.findOne({ username });
}
您可以使用此代码
findByName(user_name: string): Promise<User> {
return this.usersRepository.findOne({ user_name });
}
我通过使用 queryBuilder
成功实现了它这就是我的函数现在的样子:
findByUsername(username: string): Promise<User | undefined> {
const user = getRepository(User)
.createQueryBuilder("user")
.where("user.username = :username", { username: username })
.getOne();
return user;
}
我发现没有人使用 findOneBy,而它是为我工作的。 即使主题很旧,我可以添加替代方案吗:
async getUserByName(username: string){
return await this.userRepository.findOneBy({name: username });
}
const firstUser = await connection
.getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id", { id: 1 })
.getOne();