Lighthouseでpagination
@paginateディレクティブを使う
code:_
{
users(count: 2 page: 2){
data {
name
}
paginatorInfo {
currentPage
}
}
}
ドキュメントに書いてないのでplaygroundの補完で知った
テストはこのあたり
問題
hasManyでpagingで取得した要素のorderを変更したい
次のようなスキームがあったときに
code:schema.graphql
type User {
posts: Post! @hasMany(type: "paginator") }
type Post {
user: User! @belongsTo
}
code:_
{
user(id: $id){
posts(count: 10) {
data {
text //この順序を投稿順にしたい!
}
}
}
}
code:User.php
class User extends Model
{
public function posts() {
return $this->hasMany(Post::class);
}
}
EloquentのScopeを使えばいいという話がある が、実際にやってみると不正なクエリになる(countのaggregateの際にscopeが利用されて死ぬ)
resolverを書かないとダメ?
失敗1:@orderByを使う
posts(@orderBy: [OrderByClause!] @orderBy): [Post]! @hasMany(type: "paginator")
@hasManyで指定したpaginatorと組み合わせることができなかった(paginationをしなければ使える)
Grouping error: 7 ERROR: column "posts.posted_at" must appear in the GROUP BY clause or be used in an aggregate function LINE 1:
解決策(あまりきれいでない)
1. PostにorderByしたrelationをつくる
code:User.php
class User extends Model
{
public function posts()
{
return $this->hasMany(Post::class);
}
public function postsOrderByDesc() // これが増えた
{
return $this->posts()->orderBy('posted_at', 'DESC');
}
}
2. Schemaでは@hasManyにrelationを指定する
code:schema.graphql
type User {
posts: Post! @hasMany(type: "paginator", relation:"postsOrderByDesc") }
@hasManyの実装を読むとrelationが指定できることがわかる
type:documentの通り
以下、ドキュメントに記載がないが利用できるパラメータ
scopes: