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 $args
 */ 
 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にリクエストを送信でき、データの取得結果を確認できる

CodeIgniter

前の記事

CodeIgniter View
英語

次の記事

よく使うフレーズ