📖

Prismaでpaginationを楽に実装する(+Nest.jsでの使用法)

2023/09/29に公開

Prismaでpaginationするのに便利なパッケージがあったので紹介。
https://github.com/deptyped/prisma-extension-pagination

npm installして、

npm i prisma-extension-pagination

paginationをimportしてprisma clientをextendsして使う。

import { PrismaClient } from "@prisma/client";
import pagination from "prisma-extension-pagination";

const prisma = new PrismaClient().$extends(pagination());

すると下記のようにpaginationが使えるようになる。

const [users, meta] = prisma.user
  .paginate()
  .withPages({
    limit: 10,
    page: 2,
  });

// meta contains the following
{
  currentPage: 2,
  isFirstPage: false,
  isLastPage: false,
  previousPage: 1,
  nextPage: 3,
}

meta dataにtotal countを含めたり、cursor paginationにしたりすることも可能。

Nest.jsで使う場合

Nest.jsだと、PrismaServiceを作ってそれをDIして他のクラスで使うことが多い。
その場合にどうやってextendsすればいいかもIssueで解説されていた。
https://github.com/deptyped/prisma-extension-pagination/issues/7

以下のようにpg methodを作ってそこでextendsする。

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  async onModuleInit() {
    await this.$connect();
  }

  pg() {
    return this.$extends({
      model: {
        $allModels: {
          paginate,
        },
      },
    });
  }
}

使うときは以下のようにする。

findAll(id: string) {
    return this.prismaService.pg().user.paginate().withPages({
      limit: 10,
    });
  }

結論

paginationのprisma queryを書く必要がなくなるので、便利なライブラリだと思います。
Nest.jsで使えるのもいいです。

Discussion