Typeorm MySQL,其中类似搜索文本的列在 queryBuilder 中不起作用

问题描述 投票:0回答:1

这是我的查询生成器:

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。谢谢

nestjs typeorm nestjs-typeorm
1个回答
0
投票
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`);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.