🌵

Prismaのfindをラップしたときに、include周りで拡張性を持たせたい!

2022/05/21に公開

きっかけ

みなさんNestJS×Prismaでサービス層を書いてるときこんなことに困ったことありませんか?

findMany(classId: number): Promise<Student[]> {
  return this.prisma.student.findMany({
    where: { classId },
  });
}

findManyWithClass(classId: number): Promise<(Student & { class: Class })[]> {
  return this.prisma.student.findMany({
    where: { classId },
    include: { class: true },
  });
}

引数は全部一緒なのに、includeしたい要素が違うから同じようなメソッドを複数作らないといけない...
この2つのメソッドを一つにまとめたら解決するけど、Classデータを使わないところもあるのに毎回includeするのはちょっと微妙...

というわけでこの部分をいい感じに解決できる方法がないか考えてみました!

解決策

findMany<T extends Prisma.StudentInclude>(
  classId: number,
  include: T,
): Promise<Array<Prisma.StudentGetPayload<{ include: T }>>> {
  return this.prisma.student.findMany({
    where: { classId },
    include: include,
  });
}

たったこれだけ!終わり!

Discussion