Laravel Lighthouse(GraphQL)
目次
GraphQLとは
API用DB操作言語。クライアントアプリケーションから呼び出す。
GraphQLの特徴
従来のAPI
APIで取得するデータを定義
クライアントに取って不必要なデータまで取得してしまう。
必要な分だけ取得したい場合、APIを増やすか、パラメータによってクエリを操作する必要がある
GraphQLを利用したAPI
クライアント側で取得するデータを定義
クライアントに取って必要なデータだけ取得できる
APIを増やす必要はなく、SQLのWhere句に当たるパラメータを指定して必要なデータを限定できる
Lighthouse
Laravel用GraphQLパッケージ
・Laravel内にGraphQLサーバを稼働できる
・GraphQLのスキーマにおいて、Eloquentモデルを使用できる
・SDL(Schema Definition Language)ベースで構築する
SDL
Object | データ定義 | DBにおけるテーブル定義 |
Query | 読取 | |
Mutation | 更新 |
スキーマ
ユーザー定義スキーマ
type スキーマ名 {
フィールド名: スカラー
例
String, Int, Float, Boolean, ID, (importしたLighthouseのデータ型Date型等)
name: String
NOT NULL制約
name: String!
配列
name: [String]
}
type User {
id: Int!
name: String!
email: String
posts: [Post!]
}
type Post {
id: Int!
title: String!
published: Boolean!
author: User!
}
Queryスキーマ
余計なDirectiveを取り除いた読取用スキーマのサマリ
この各フィールドがクライアントからコール可能になる
Query例
type Query {
users: [User!]!
user(id: ID): User
}
コール例
{
user(id: 1) {
name
email
}
}
Mutationスキーマ
更新用スキーマ
この各定義名がクライアントからコール可能になる
※createUser、updateUser、deleteUser
type Mutation {
createUser(
id: ID!,
name: String!,
email: String!,
): User @create
updateUser(
id: ID!,
name: String,
email: String,
): User @update
deleteUser(id: ID!): User @delete
}
createコール例
mutation {
createUser(
name: "ユーザー名"
,
email: "test@test.com"
,
) {
id
name
}
}
updateコール例
mutation {
updateUser(
id: 999,
email: "test@test.com"
,
) {
id
email
}
}
deleteコール例
mutation {
deleteUser(
id: 999,
) {
id
email
}
}
ディレクティブ
all | 全件取得 | |
eq | 一致 | |
find | 取得 | |
first | 先頭取得 | |
create | 追加 | |
delete | 削除 | |
update | 更新 | |
hasOne | リレーション | |
hasMany | リレーション | |
belongsTo | リレーション | |
belongsToMany | リレーション | |
model | modelクラスを指定 | |
field | resolverを指定 |
type Query {
posts: [Post!]! @all
post(id: Int! @eq): Post @find
}
type User {
id: ID!
posts: [Post!]! @hasMany
}
type Post {
〜
}
リゾルバ
データ操作、データ取得を返すメソッド
Laravelのクラスを指定できて処理内容をLaravelで書ける
例
type Mutation {
createUser(
id: ID!,
name: String,
〜
): User
@field(
resolver: “User@create”
)
※/app/GraphQL/Mutations/User.php
class User
{
/**
* @param null $_
* @param array
*/
public function __invoke($_, array $args)
{
}
public function create(
$_,
array $args,
GraphQLContext $context,
ResolveInfo $resolveInfo
)
{
$id = collect($args['id']);
$name = collect($args['name']);
更新処理等
}
}
クエリ
{
users {
name
email
}
}
playground
GraphQL用クライアントツール
ブラウザベースでGraphQLにリクエストを送信でき、データの取得結果を確認できる