Open1

prismaでソフトデリートができるようにする

masatotezukamasatotezuka

prismaでソフトデリートする場合はミドルウェアで設定する

前提

prismaではソフトデリートのクエリや属性が用意されていない。(そのうち用意してくれるかな。。)

実現

  1. クエリ実行前にクエリの種類をDELETEからUPDATREに変更する
  • deleteupdate
  • deleteManyupdateMany
  1. あらかじめ、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);
//これ以降の処理はクエリ実行後に行われる
});

https://www.prisma.io/docs/concepts/components/prisma-client/middleware/soft-delete-middleware