【GraphQL】バックエンドでページネーションを追加する
GraphQL

【GraphQL】バックエンドでページネーションを追加する

作成日:2021年12月02日
更新日:2022年12月27日

前回は、バックエンドで PostgresSQL から MongoDB へ乗り換えました。

graphql-client-mongodb

【GraphQL】PostgresSQLからMongoDBへ乗り換える

今回は、バックエンドでページネーションを追加します。

ソースコードは、こちらです。

バックエンド:

例えば 200 件データがあるとして、最初の 10 件を表示します。 一番下まで画面を移動するとボタンがあり、クリックすることで次の 10 件を表示することができます。

まずはバックエンドで、データを送信する内容を調整します。

ページネーションが作動するか確認するため、books のデータを追加しました。

image2

ページネーションを行うには、prisma の skip と take を使います。

skip は、最初のいくつかをスキップします。 例えば skip を『4』に設定すると、4 件スキップされ、5 件目のデータから取得されます。

take は、いくつの件数を取得するかを指定できます。

例えば 5 件データを取得したい場合、take を『5』に設定します。

また、skip を『3』、take を『5』にすると、4 件目のデータから 5 件データを取得することができます。

schema.ts を開いて、typeDefsQueryにあるbooksを修正します。

booksskiptakeを追加します。

どちらも Int 型にしましょう。

ts
books(isRead: Boolean, skip: Int, take: Int): [Book!]!

次に resolvers フォルダの Query.ts を開きます。

Querybooksに GraphQL で指定したskiptakeを取得するようにします。

skiptakeは number 型にします。

ts
books: (
_: any,
{ isRead, skip, take }: { isRead: boolean; skip: number; take: number },
{ prisma }: Context
) => {
return prisma.book.findMany({
where: {
isRead,
},
});
},

findMany内に、skiptakeを指定しましょう。

ts
books: (
_: any,
{ isRead, skip, take }: { isRead: boolean; skip: number; take: number },
{ prisma }: Context
) => {
return prisma.book.findMany({
skip,
take,
where: {
isRead,
},
});
},

では、Apollo Studio を開いて、動作確認します。

今現在のデータが 6 件あります。

image3

skip を『2』、take を『3』と設定します。

graphql
query FilteredBooks {
books(skip: 2, take: 3) {
title
author
}
}

image4

FilteredBooks ボタンをクリックすると、

image5

3 件目から 5 件目のデータを取得することができました。

ソースコードは、こちらです。

次回は、フロントエンドでページネーションを実装します。

graphql-frontend-pagination

【GraphQL】フロントエンドでページネーションを実装する

© 2024あずきぱんウェブスタジオ