GraphQLでrelationのあるtypeを返すresolverをどうかけばよいか
relationのあるtypeのresolverの書き方はどうすればいいのかという問題
relationを使ったときの型が面倒かもしれない(lighthouse固有の問題ではない)
問題
例えば次のようなスキーマがあったとする
code:schema.graphql
type User {
id: ID!
// その他色々なキー
}
type Post {
id: ID!
// 色々なキー
user: User! @belongsTo
}
これはlighthouseのElouentモデルとの連携をするディレクティブを使うと簡単に取得できる
code:schema.graphql
type Query {
posts: Post!! @paginate('PostEloquent') post(id: ID @eq): Post @find(model: 'PostEloquent')
}
のようにすればpostを引いたときに投稿したuserの情報も自動的に引っ張ってくることができる(Eloquentのrelationを使っている?)
問題は、自分で独自のPostを返すresolverを書いたとき
code: schema.graphql
type Query {
}
owesomePostsのresolverは独自に定義する必要があり(というかそういうロジックを書きたいときがあり)、このとき当然Post型のレスポンス(つまりUserも)を返さなければならない
ドメインで定義しているPostのEntityは普通Userを持っていないはずなので、いちいちUserを引いてこないといけないのが、めんどくさいし余計な感じがする
一方で、型として許容している以上、返さないと問題になる(ひこうと思ったのに引けないのでバグ)
もし型をPostにしているのにuser要素を返さないresolverの実装になっている場合、owesomePostでUserをひこうとした場合にエラーが出る(要素をひこうとして初めてランタイムエラーになる)
暫定的な対応
code:schema.graphql
type PostWithoutUser {
id: ID!
// 色々なキー
}
のような型を返す
うまい方法には全く思えないのでなんとかしたい