15. Soft Delete
Мягкое удаление (soft delete) — это паттерн, при котором записи не удаляются физически из базы данных, а лишь помечаются как удалённые с помощью специального поля deletedAt. Это позволяет восстанавливать данные и сохранять историю изменений.
Схема с полем deletedAt
Заголовок раздела «Схема с полем deletedAt»model User { id Int @id @default(autoincrement()) email String @unique name String deletedAt DateTime? // null = активен, дата = удалён createdAt DateTime @default(now())}Middleware для soft delete
Заголовок раздела «Middleware для soft delete»prisma.$use(async (params, next) => { if (params.model === 'User') { // Перехватить delete → soft delete if (params.action === 'delete') { params.action = 'update' params.args['data'] = { deletedAt: new Date() } } if (params.action === 'deleteMany') { params.action = 'updateMany' if (params.args.data !== undefined) { params.args.data.deletedAt = new Date() } else { params.args['data'] = { deletedAt: new Date() } } }
// Автоматически фильтровать удалённые if (['findFirst', 'findMany', 'findUnique'].includes(params.action)) { params.args.where = { ...params.args?.where, deletedAt: null, } } }
return next(params)})Восстановление записи
Заголовок раздела «Восстановление записи»// Восстановить удалённую записьconst restored = await prisma.user.update({ where: { id: userId }, data: { deletedAt: null },})Получение удалённых записей
Заголовок раздела «Получение удалённых записей»Для доступа к удалённым записям нужно использовать $queryRaw или временно отключить middleware:
// Все записи включая удалённыеconst allUsers = await prisma.$queryRaw` SELECT * FROM "users" WHERE "deletedAt" IS NOT NULL`