如何在nuwave/lighthouse与Laravel中为对象类型Eloquent关联添加where条件
解决方案
方案1:使用字段解析器(适合复杂逻辑场景)
- 首先在
Page类型的subpages字段上添加@field指令,指定专属解析器
type Page { id: ID! name: String! slug: String! active: Boolean subpages: [Page!] @field(resolver: "App\\GraphQL\\Resolvers\\PageSubpagesResolver") created_at: DateTime! updated_at: DateTime! }
- 新建对应的解析器类,在解析方法中添加需要的查询条件
<?php namespace App\GraphQL\Resolvers; class PageSubpagesResolver { public function __invoke(\App\Models\Page $page) { // 此处可自定义任意查询条件,完全不影响模型原有关联的使用 return $page->subpages() ->whereNull('deleted_at') ->where('active', 1) ->get(); } }
方案2:使用@hasMany指令绑定本地作用域(性能更优,推荐简单过滤场景)
这个方案可以利用Lighthouse自带的关联预加载优化,避免N+1查询问题:
- 首先在
Page模型中添加专属的本地作用域方法
// App\Models\Page.php public function scopeGraphQLSubpagesFilter($query) { return $query ->whereNull('deleted_at') ->where('active', 1); }
- 修改
Page类型的subpages字段,用@hasMany指令绑定作用域
type Page { id: ID! name: String! slug: String! active: Boolean subpages: [Page!] @hasMany(scope: "graphQLSubpagesFilter") created_at: DateTime! updated_at: DateTime! }
额外优化建议
你当前PageTree查询类中的写法是先拉取用户所有页面再用集合过滤,数据量较大时性能较差,建议改成查询构造器层面过滤:
class PageTree { public function __invoke($_, array $args){ $user = Auth::user(); return $args['id'] ? $user->pages()->where('parent_id', $args['id'])->get() : $user->pages()->whereNull('parent_id')->get(); } }
内容的提问来源于stack exchange,提问作者joh3rd
相关产品推荐
相关产品推荐

