如何在Laravel 5.8+Lighthouse中实现用户关联星标列表的GraphQL查询
嘿,这事儿不难,咱们一步步来把这个嵌套查询搞定,让你的GraphQL结构更优雅!
第一步:先搞定Eloquent模型关联
首先得确保你的User模型和Clist模型之间有正确的关联方法,用来专门获取星标列表。打开app/User.php,添加下面的关联:
// app/User.php public function clistsByStarred() { // 这里假设Clist表的外键是user_id,要是你的外键不一样,记得改成你实际的字段名 return $this->hasMany(Clist::class, 'user_id') ->where('starred', true); // 直接过滤出星标为true的列表 }
第二步:修改GraphQL Schema,把字段嵌套到User类型里
接下来要在你的GraphQL schema文件(一般是graphql/schema.graphql)里,给User类型添加这个关联字段。用Lighthouse的@hasMany指令就能自动关联到咱们刚才定义的模型方法:
type User { id: ID! name: String! # 这里加上你的嵌套字段,名字和模型里的关联方法保持一致 clistsByStarred: [Clist!]! @hasMany # 其他已有的User字段... }
如果你的场景需要更灵活的逻辑(比如后续要加参数过滤),也可以用自定义解析器:
可选:用自定义解析器实现(更灵活)
先在schema里定义字段并指定解析器类:
type User { id: ID! name: String! clistsByStarred: [Clist!]! @fieldResolver(class: "App\\GraphQL\\Resolvers\\UserStarredClistsResolver") }
然后创建解析器类:
// app/GraphQL/Resolvers/UserStarredClistsResolver.php namespace App\GraphQL\Resolvers; use App\User; use Illuminate\Database\Eloquent\Relations\Relation; class UserStarredClistsResolver { public function __invoke(User $user, array $args): Relation { // 这里可以写更复杂的逻辑,比如根据args传参过滤 return $user->clists() // 假设你已经有一个通用的clists关联 ->where('starred', true); } }
第三步:测试你的嵌套查询
现在就可以用你想要的优雅写法查询了:
query { user(id: 1) { id name clistsByStarred { id name starred } } }
这样就把原来的独立查询完美嵌套到user查询下面了,结构更符合GraphQL的设计思想,看起来干净多了!
内容的提问来源于stack exchange,提问作者Geraud Schmit
相关产品推荐
相关产品推荐

