Zoeken op website

node.js - Typeorm MySql zoeken op "kolom like %var%"


Hoe te zoeken in MySql met typeorm door gebruik te maken van "column like".

 async findAll({
    page,
    count,
    ...where
  }: CategorySelectFilter): Promise<Category[]> {
    return this.categoryRepository.find({
      where,
      take: count,
      skip: (page - 1) * count,
      order: {
        createdAt: 'DESC',
      },
    });
  }

Wanneer "where" een naam bevat, moet het zoeken met "name like %var_name%" en niet alleen "name=var_name".

Ik heb iets nodig zoals de hook @BeforeLoad om de name-eigenschap in een entiteit te overschrijven.

Ik heb geprobeerd @Index({fullText: false}) op de naamkolom te gebruiken, maar het werkt niet.

Antwoord #1

Hier is mijn oplossing die ik altijd in mijn projecten gebruik.

Ik gebruik de voorwaardelijke spread-syntaxis (...) om de query dynamisch te 'bouwen'. Zie dit voor meer informatie.

async findAll({
    page,
    count,
    whereConditions
}: CategorySelectFilter): Promise<Category[]> {
    return this.categoryRepository.find({
        ...whereConditions,
        take: count,
        skip: (page - 1) * count,
        order: {
            createdAt: 'DESC',
        },
        where: {
            ...(whereConditions.name !== undefined && { name: ILike(`%${whereConditions.name}%`) }),
        }
    });
}

De where-voorwaarde name: "%VARIABLE%" wordt alleen toegevoegd als name aanwezig is in het whereConditions-object.

PS: Ik geef de voorkeur aan het gebruik van ILike: kan in plaats van Like worden gebruikt om de overeenkomst niet-hoofdlettergevoelig te maken volgens de actieve locale.