Продвинутые методы использования нескольких необязательных предложений WHERE в TypeORM

При работе с TypeORM, мощной библиотекой объектно-реляционного сопоставления (ORM), вы можете столкнуться со сценариями, в которых вам необходимо создавать запросы с несколькими необязательными предложениями WHERE. Эти предложения позволяют фильтровать результаты запроса на основе различных условий. В этой статье мы рассмотрим несколько методов эффективного решения таких ситуаций, а также приведем примеры кода.

Метод 1: динамическое построение запроса
Один из подходов предполагает динамическое построение запроса на основе наличия необязательных параметров. Вот пример:

import { getRepository, Like } from 'typeorm';
import { User } from '../entities/User';
async function getUsersByNameAndEmail(name?: string, email?: string): Promise<User[]> {
  const userRepository = getRepository(User);
  const queryBuilder = userRepository.createQueryBuilder('user');
  if (name) {
    queryBuilder.andWhere('user.name = :name', { name });
  }
  if (email) {
    queryBuilder.andWhere('user.email = :email', { email });
  }
  return queryBuilder.getMany();
}

Метод 2: собственный метод репозитория
Другой подход — создать в вашем репозитории собственный метод, который обрабатывает необязательные предложения WHERE. Вот пример:

import { EntityRepository, Repository } from 'typeorm';
import { User } from '../entities/User';
@EntityRepository(User)
export class UserRepository extends Repository<User> {
  async getUsersByNameAndEmail(name?: string, email?: string): Promise<User[]> {
    const queryBuilder = this.createQueryBuilder('user');
    if (name) {
      queryBuilder.andWhere('user.name = :name', { name });
    }
    if (email) {
      queryBuilder.andWhere('user.email = :email', { email });
    }
    return queryBuilder.getMany();
  }
}

Метод 3: использование необработанных выражений SQL
В некоторых случаях вам может потребоваться более сложная логика фильтрации, которую невозможно реализовать с помощью построителя запросов TypeORM. В таких сценариях вы можете использовать необработанные выражения SQL. Вот пример:

import { getRepository } from 'typeorm';
import { User } from '../entities/User';
async function getUsersByCustomFilter(name?: string, email?: string): Promise<User[]> {
  const userRepository = getRepository(User);
  const query = `
    SELECT * FROM user
    WHERE 1 = 1
    ${name ? 'AND name = :name' : ''}
    ${email ? 'AND email = :email' : ''}
  `;
  return userRepository.query(query, { name, email });
}

В этой статье мы рассмотрели несколько методов обработки нескольких необязательных предложений WHERE в запросах TypeORM. Используя динамическое построение запросов, пользовательские методы репозитория или необработанные выражения SQL, вы можете создавать гибкие и эффективные запросы на основе различных условий. Эти методы позволяют создавать более надежные и настраиваемые запросы к базе данных с помощью TypeORM.