1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LaravelでGraphQLサーバーを作成できるLighthouseの解説(ディレクティブ)

Last updated at Posted at 2020-06-16

前回(導入) https://qiita.com/muu33/items/118949635416ed0a6dae
今回はLighthouseの特徴的な機能であるディレクティブの基本的な利用例。
命名規則を守ることでLaravelのEloquent Modelをスキーマと連携することができる。

Lighthouse

公式:https://lighthouse-php.com/
LaravelでGraphQLを利用するためのライブラリ。

取得更新系

all

全てのModelのコレクションを取得。

type Query {
  users: [User!]! @all
}

find

指定したIDのModelを取得。

type Query {
  userById(id: ID! @eq): User @find
}

first

指定された条件に一致する最初のModelを取得。

type Query {
  userByFirstName(name: String! @eq): User @first
}

create

指定したレコードを作成。

type Mutation {
  createUser('name': String!): Post @create
}

delete

指定したレコードを削除。
リスト型にすることで複数削除することが可能。

type Mutation {
  deleteUser(id: ID!): User @delete
}

type Mutation {
  deleteUser(id: [ID!]!): [User] @delete
}

update

指定したレコードを指定したnameで更新。

type Mutation {
  updateUser(id: ID!, name: String): User @update
}

リレーション

Eloquentの公式ドキュメント対応例
https://readouble.com/laravel/7.x/ja/eloquent-relationships.html
スキーマのフィールドとModelのメソッド名が同じ必要がある

1対1

// User Model
class User extends Model
{
    /**
     * ユーザーに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

// Phone Model
class Phone extends Model
{
    /**
     * この電話を所有するUserを取得
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

スキーマ

type Query {
  userById(id: ID! @eq): User @find
  phoneById(id: ID! @eq): Phone @find
}

type User {
	id: ID!
	name: String!
	phone: Phone! @hasOne 
}

type Phone {
	id: ID!
	number: String!
	user: User! @belongsTo
}

1対多

// Post Model
class Post extends Model
{
    /**
     * ブログポストのコメントを取得
     */
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

// Comment Model
class Comment extends Model
{
    /**
     * このコメントを所有するポストを取得
     */
    public function post()
    {
        return $this->belongsTo('App\Post');
    }
}

スキーマ

type Query {
  postById(id: ID! @eq): Post @find
  commentById(id: ID! @eq): Comment @find
}

type Post {
	id: ID!
	name: String!
	comments: [Comment!]! @hasMany
}

type Comment {
	id: ID!
	message: String!
	post: Post! @belongsTo
}

多対多

// User Model
class User extends Model
{
    /**
     * userに所属する役目を取得
     */
    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }
}

// Role Model
class Role extends Model
{
    /**
     * 役目を所有するユーザー
     */
    public function users()
    {
        return $this->belongsToMany('App\User');
    }
}

スキーマ

type Query {
  userById(id: ID! @eq): User @find
  roleById(id: ID! @eq): Role @find
}

type User {
	id: ID!
	name: String!
	roles: [Role!]! @belongsToMany
}

type Role {
	id: ID!
	name: String!
	users: [User!]! @belongsToMany
}

まとめ

LighthouseのディレクティブはEloquentと連携することでシンプルに実装することができてすごい(小並感)
まだまだ勉強中なので次回があったらもう少し踏み込むかも。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?