📚

Prisma+NestJSでGraphqlのサブフィールドを取得する

mym_bravo2022/08/11に公開

個人開発をしているアプリでフロントエンドはNext.jsを使っています。

バックエンドはNestJS+prismaでGraphQLを実装しています。そこでこんなクエリを実行する必要がありました。

query {
 	coffeeShops {
  	id,
	name,
	email,
	coffeeCountry {
            id,
            name
        },
        coffeeShopArea {
            id,
            label
        }
	}
}

今回は、NestJSで↑のようなクエリを実行するときに必要なprismaの実装方法を解説します。

前提・準備

解説に入る前に開発環境などの前提を説明します。

コーヒーショップ(coffeeShopクラス)のモデル定義

モデルについて補足します。

coffeeShopのクラスにcoffeeCountry(原産国)、coffeeShopArea(ショップのエリア)を持つようにしています。

import { Field, ID, ObjectType } from '@nestjs/graphql';
import { CoffeeCountry } from 'src/coffeeCountries/models/coffeeCountry.model';
import { CoffeeShopArea } from 'src/coffeeShopAreas/models/coffeeShopArea.model';

@ObjectType()
export class CoffeeShop {
  @Field(() => ID)
  id: number;
  name: string;
  email: string;
  coffeeCountry: CoffeeCountry;
  coffeeShopArea: CoffeeShopArea;
}

開発環境

以下、ライブラリやアプリのバージョンを表にまとめます。

ソフトウェア、アプリ バージョン 確認方法
docker Docker version 20.10.14 コマンドで確認
Node node:14.17.0 Dockerfileで確認
Next.js "next": "12.1.4" package.json
yarn "yarn": "1.22.5” yarn -v で確認
typescript "typescript": "4.6.3" package.json
prisma "^4.0.0” package.json

GraphQLのサブフィールド

このようなネストしたクエリにおいて、coffeeShopsに中にあるcoffeeCountyやcoffeeShopAreaのことをサブフィールドと言います。

query {
 	coffeeShops {
  	id,
	name,
	email,
	coffeeCountry {
            id,
            name
        },
        coffeeShopArea {
            id,
            label
        }
	}
}

PrismaのGraphqlのサブフィールドを取得する

結論、今回のポイントは QueryのcoffeeShopsメソッドにおける、{coffeeCountry: true, coffeeShopArea: true} の箇所になります。

NestJSにおいてincludeをtrueにすることでサブフィールドのクエリを取得することができます。

import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
import { PrismaService } from '../prisma.service';
import { CoffeeShop } from './models/coffeeShop.model';

@Resolver(() => CoffeeShop)
export class CoffeeShopsResolver {
  constructor(private prisma: PrismaService) {}

  @Query(() => [CoffeeShop])
  async coffeeShops() {
    return this.prisma.coffeeShop.findMany({
      include: { coffeeCountry: true, coffeeShopArea: true }, // ここがポイント
    });
  }

}

(これは実装方法というより設定のレベルですね。)

playgroundからクエリを実行してみて、無事取得できればOKです

宣伝

カフェインレスコーヒーを集めたサイトを運営しています。

カフェインレスコーヒーを集めたサイトを作っています。カフェインレスコーヒーは夜に飲んでもぐっすり眠れるので、エンジニアの人にも試してみてほしいな、と思い作りました。よければのぞいてみてください。

これから色々と機能を追加していく予定です。

https://caffeinelessmore.com/

(初期ロード時に15秒くらいかかることがあります)

参考

https://graphql.org/learn/queries/

https://qiita.com/Gma_Gama/items/90b98e046e1b66a71c22

https://qiita.com/yuya1212h4/items/fe7a2b640cf39dab3e8a

https://zenn.dev/oshanqq/scraps/7940e9924dd7aa

Discussion

ログインするとコメントできます