При работе с 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.