Laravel Lighthouse中如何将父数据传递给子字段?
Laravel Lighthouse嵌套字段传参问题解决方案
你之前尝试修改ResolveInfo的queryPlan或argumentSet来传递参数的思路走不通,因为这两个对象是用来描述查询的静态结构的,并非用于在解析流程中传递动态数据,所以修改它们不会影响子字段的解析参数。
下面给两个可行的解决方案:
方案一:通过父数据($_)传递参数
虽然你认为$_无法传递数据,但其实可以在父字段解析器中把需要的参数附加到返回的父数据上,子字段直接从$_中读取即可:
// PropertiesFiltered类的parent方法 public function parent($root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) { // 若返回自定义对象,直接添加属性 $parentData = new \stdClass(); $parentData->ok = '要传递的参数值'; // 若返回数组,直接添加键值对 // $parentData = ['ok' => '要传递的参数值']; return $parentData; } // child方法中读取参数 public function child($_, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) { $okValue = is_object($_) ? $_->ok : $_['ok']; // 后续业务逻辑处理 }
方案二:通过GraphQLContext传递参数
上下文对象在整个查询解析过程中全局可用,适合跨字段传递数据:
// parent方法中存入参数 public function parent($root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) { // 将参数存入上下文 $context->set('properties_ok', '要传递的参数值'); return $parentData; } // child方法中取出参数 public function child($_, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) { $okValue = $context->get('properties_ok'); // 后续业务逻辑处理 }
注意:如果父字段返回批量数据(比如多个模型实例),使用上下文传递时要注意数据隔离,最好结合每个父项的唯一标识存储参数,避免互相覆盖。
内容的提问来源于stack exchange,提问作者Steve Moretz
相关产品推荐
相关产品推荐

