記事の目的
ポリモーフィックについて学習した際の備忘録
テーブル定義
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
}
}
}
}