0
0

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 1 year has passed since last update.

【Laravel×graphql(lighthouse)】1対多(ポリモーフィック)の値の取得方法について

Posted at

記事の目的

ポリモーフィックについて学習した際の備忘録

テーブル定義

table
users
    id - integer
    name - string

admins
    id - integer
    name - string

comments
    id - integer
    comment - string
    commenter_id - integer ##hogehoge_idにするとモデル定義のリレーション定義が自動でされるっぽい
    commenter_type - string ##hogehoge_typeにするとモデル定義のリレーション定義が自動でされるっぽい

モデル定義

Models/Comment.php
## 関数名をhogehoge, IDのカラムをhogehoge_id, typeのカラムをhogehoge_typeとすると、laravelが勝手に解釈してくれるっぽい
function commenter(){
    return $this->morphTo();
}
Models/User.php
function comments(){
    return $this->morphMany(Comment::class, 'commenter');
}
Models/Admin.php
function comments(){
    return $this->morphMany(Comment::class, 'commenter');
}

type定義

User.graphql
type User{
    id
    name
    "リレーション"
        comments: [Comment] @morphMany
}
Admin.graphql
type Admin{
    id
    name
    "リレーション"
        comments: [Comment] @morphMany
}
Comment.graphql
type Comment{
    id
    name
    "リレーション"
    commenter: Commenter @morphTo
}

union Commenter = Admin | User

query

queries
extend type Query {
    admins: [Admin] @all
}

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

extend type Query {
    comments: [Comment] @all
}

リクエスト

リクエスト
## 親から取得する場合は通常のリレーションと変わらない
query{
   admins{
     comments{
       id
       comment
       ・・・
     }
   } 
  comments{
    ## それぞれのtypeを定義しておくと対象のレコードに対応したデータセットが返却される
    ## commenter_typeがApp\Models\Adminの場合はAdminの型で返却される
    commenter{
      ...on Admin{
        name
      }
      ...on User{
        name
      }
    }
  }
}

参照

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?