Для реализации поиска по LIKE
в поле name
с использованием Prisma, нужно использовать оператор contains
или startsWith
/endsWith
в запросе. Эти операторы позволяют выполнять частичное совпадение строк, аналогично SQL LIKE
.
Обновленный метод в сервисе
Вот как можно обновить метод getAllDocumentsByNameTypeId
для поиска по LIKE
в поле name
и фильтрации по typeId
:
typescript
async getAllDocumentsByNameTypeId(name: string, typeId: number) {
return this.prisma.documents.findMany({
where: {
typeId: Number(typeId), // Преобразуем строку в число
name: {
contains: name, // Поиск по частичному совпадению (аналог SQL LIKE '%name%')
mode: 'insensitive', // Не учитывать регистр (опционально)
},
},
});
}
Объяснение кода
findMany
:- Используется для получения нескольких записей из базы данных, соответствующих условиям.
where
:- Условие фильтрации:
typeId: Number(typeId)
: Фильтрует записи поtypeId
.name: { contains: name }
: Выполняет поиск по частичному совпадению строки в полеname
. Это аналог SQLLIKE '%name%'
.mode: 'insensitive'
: Делает поиск нечувствительным к регистру (например,Document
иdocument
будут считаться совпадением).
- Условие фильтрации:
- Возвращаемое значение:
- Метод возвращает массив документов, соответствующих условиям.
Пример использования
Если вы вызываете этот метод из контроллера, он может выглядеть так:
typescript
import { Controller, Get, Query, NotFoundException } from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiQuery } from '@nestjs/swagger';
import { DocumentsService } from './documents.service';
@Controller('documents')
export class DocumentsController {
constructor(private readonly documentsService: DocumentsService) {}
@ApiOperation({ summary: 'Получить список документов по названию и типу' })
@ApiResponse({ status: 200, description: 'Документы успешно найдены.' })
@ApiResponse({ status: 404, description: 'Документы не найдены.' })
@ApiQuery({ name: 'name', required: false, description: 'Название документа' })
@ApiQuery({ name: 'type_id', required: true, description: 'Тип документа' })
@Get()
async findDocuments(
@Query('name') name: string,
@Query('type_id') typeId: number,
) {
const documents = await this.documentsService.getAllDocumentsByNameTypeId(
name,
typeId,
);
if (!documents || documents.length === 0) {
throw new NotFoundException('Документы не найдены.');
}
return documents;
}
}
Пример запросов
- Поиск по названию документа (частичное совпадение):javascript
GET /documents?name=Doc&type_id=1
- Найдет все документы, у которых
name
содержитDoc
(например,Document 1
,MyDoc
).
- Найдет все документы, у которых
- Поиск только по типу документа:javascript
GET /documents?type_id=1
- Найдет все документы с
type_id = 1
.
- Найдет все документы с
- Поиск по названию и типу:javascript
GET /documents?name=Doc&type_id=2
- Найдет документы, у которых
name
содержитDoc
иtype_id = 2
.
- Найдет документы, у которых
Особенности Prisma
contains
: Аналог SQLLIKE '%value%'
.startsWith
: Аналог SQLLIKE 'value%'
.endsWith
: Аналог SQLLIKE '%value'
.mode: 'insensitive'
: Делает поиск нечувствительным к регистру.