前回(導入) 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と連携することでシンプルに実装することができてすごい(小並感)
まだまだ勉強中なので次回があったらもう少し踏み込むかも。