前回は、Prismaを使って、PostgresSQLデータを取得しました。

今回は、特定のPostgresSQLデータを取得します。

コードは、前回のコードを使用します。

また、Prisma StudioにBookのデータを追加しました。

image2

BookのisReadがtrueのデータ一覧を取得する

まずは、isReadがtrueかfalseかで一覧を取得できるようにします。

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

QuerybooksisReadを追加します。

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

findMany()の中に、isReadを抽出するコードを作成します。

prismaでデータを抽出するには、whereを使います。

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

また、shema.tsのtypeDefsに設定している、BooksfilterisRead:Boolean!にします。

BooksInputも削除しておきましょう。

type Query {
  books(isRead: Boolean!): [Book!]!
  book(id: Int!): Book
  categories: [Category!]!
  category(id: Int!): Category
}

では、GraphQLサーバーを起動して確認します。

isReadtrueの場合を設定します。

query FilteredBooks{
  books(isRead: true) {
    id
    title
    author
  }
}

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

image3

isReadがtrueのデータのみ抽出することができました。

単一データを取得する

次は、特定のIDデータを取得します。

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

bookのargsにidを選択し、dbをprismaにします。

book: (_: any, { id }: { id: number }, { prisma }: Context) => {
},

prismaで単一のデータを取得するには、findUniqueを使用します。

さらに、idを指定するために、whereも使用します。

book: (_: any, { id }: { id: number }, { prisma }: Context) => {
  return prisma.book.findUnique({
    where: {
      id,
    },
  });
},

完成しましたので、GraphQLで確認します。

query SingleBook($bookId: Int!) {
  book(id: $bookId) {
    id
    title
    author
  }
}

bookIdは、『1』を指定します。

image4

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

image5

idが『1』のデータを取得することができました。

カテゴリ一覧のデータを取得する

BookのcategoryIdを使って、カテゴリ一覧のデータを取得します。

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

Queryのbooksやbookを参考に、categoriesとcategoryを修正します。

categories: (_: any, __: any, { prisma }: Context) => {
  return prisma.category.findMany();
},
category: (_, { id }: {id: number}, { prisma }: Context) => {
  return prisma.category.findUnique({
    where : {
      id
    }
  })
},

resolversフォルダのCategory.tsを開きます。

prismaのfindManyを使い、bookのcategoryIdとcategoryのidを紐付けます。

import { Context } from "../index";

export const Category = {
  books: ({ id }: {id: number}, _: any, { prisma }: Context) => {
    return prisma.book.findMany({
      where: {
        categoryId: id,
      }
    })
  },
};

GraphQLで確認します。

image6

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

image7

カテゴリ別でデータを取得することができました。

BookのcategoryIdからカテゴリ名を取得する

resolversフォルダのBook.tsを開きます。

prismaのfindUniquieを使い、categoryのidとbookのcategoryIdを紐付けます。

import { Context } from "../index";

export const Book = {
  category: (
    { categoryId }: { categoryId: number },
    _: any,
    { prisma }: Context
  ) => {
    return prisma.category.findUnique({
      where: {
        id: categoryId,
      },
    });
  },
};

では、ブラウザで確認しましょう。

image8

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

image9

Bookデータ内で、カテゴリ名を取得することができました。

index.tsのdbは、必要ないので削除します。

全文は、以下の通りです。

次回は、PostgresSQLデータを追加や削除、更新します。

ブログ一覧