📚
Prisma+NestJSでGraphqlのサブフィールドを取得する
個人開発をしているアプリでフロントエンドは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です
宣伝
カフェインレスコーヒーを集めたサイトを運営しています。
カフェインレスコーヒーを集めたサイトを作っています。カフェインレスコーヒーは夜に飲んでもぐっすり眠れるので、エンジニアの人にも試してみてほしいな、と思い作りました。よければのぞいてみてください。
これから色々と機能を追加していく予定です。
(初期ロード時に15秒くらいかかることがあります)
参考
Discussion