这是我的查询生成器:
const users = await this.userRepository
.createQueryBuilder()
.select(['firstName', 'lastName'])
.where('LOWER(firstName) LIKE :search', {
search: `%${query.search.toLowerCase()}%`,
})
.getRawMany();
错误: EntityPropertyNotFoundError:在“用户”中找不到属性“搜索”。确保您的查询正确。
firstName 和 lastName 都是有效的用户属性。我也试过这样:
const users = await this.dataSource
.getRepository(User)
.createQueryBuilder()
.select(['firstName', 'lastName'])
.where('LOWER(firstName) LIKE :search', {
search: `%${query.search.toLowerCase()}%`,
})
.getRawMany();
但它是一样的。数据库是mysql。谢谢
const lowercaseName = query.search.toLowerCase();
const users = await this.userRepository
.createQueryBuilder()
.select(['firstName', 'lastName'])
.where(
// Omit this `User.` if not needed, it will work without it
`MATCH(LOWER(`User.`firstName)) AGAINST(:name IN NATURAL LANGUAGE MODE)`,
{
name: `*${lowercaseName}*`,
},
)
.getRawMany();
此
AGAINST SEARCH
需要在名字栏中添加 FULLTEXT-INDEX
要解决此问题,请运行此迁移:
import { MigrationInterface, QueryRunner } from 'typeorm';
export class AddFullTextIndexToUser1612345678901 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE User ADD FULLTEXT INDEX idx_user_firstName (firstName)`
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE User DROP INDEX idx_user_firstName`);
}
}