Open1
prismaでソフトデリートができるようにする
prismaでソフトデリートする場合はミドルウェアで設定する
前提
prismaではソフトデリートのクエリや属性が用意されていない。(そのうち用意してくれるかな。。)
実現
- クエリ実行前にクエリの種類をDELETEからUPDATREに変更する
-
delete
→update
-
deleteMany
→updateMany
- あらかじめ、ModelにdeletedAtを作成しておき、サービス層でDELETEのクエリが実行されたら、deletedAtに削除日が更新されるようにする
prisma
import { PrismaClient } from '@prisma/client';
export const prisma = new PrismaClient();
//アプリケーションで `prisma` を使用することで、DBのデータを読み書きができるようになる。
//ミドルウェア
//$use()メソッドでミドルウェアを追加
prisma.$use(async (params, next) => {
//クエリ実行前に下記の処理が行われる
if (params.action === 'delete') {
params.action = 'update';
params.args['data'] = { deletedAt: new Date() };
} else if (params.action === 'deleteMany') {
params.action = 'updateMany';
params.args['data'] = { deletedAt: new Date() };
}
return next(params);
//これ以降の処理はクエリ実行後に行われる
});