使用GraphQL与Drupal从多值字段获取整数数据时遇到类型匹配及可迭代对象问题求助
解决Drupal GraphQL多值整数字段返回对象而非纯整数的问题
这个问题核心在于Drupal的多值字段在GraphQL中默认返回的是字段项对象数组,每个字段项里的value属性才是你要的整数,而你的类型定义numbers: [Int]期望的是纯整数数组,所以类型不匹配导致报错。
解决方案:在解析器中添加字段值提取逻辑
你可以通过callback解析器遍历多值字段的每个项,提取并转换出value属性的整数值。修改你的字段解析器代码如下:
$registry->addFieldResolver('Card', 'numbers', $builder->compose( // 第一步:获取多值字段的所有项对象 $builder->produce('property_path') ->map('type', $builder->fromValue('entity:node:bingo_card')) ->map('path', $builder->fromValue('field_bingo_card_numbers')) ->map('value', $builder->fromParent()), // 第二步:遍历每个项,提取并转换为整数 $builder->callback(function ($items) { // 先确保输入是数组,避免非预期报错 if (!is_array($items)) { return []; } // 映射每个字段项,取出value并转为整数 return array_map(function ($item) { // 处理可能的空值,同时把字符串转为整数 return isset($item['value']) ? (int)$item['value'] : null; }, $items); }) ));
为什么之前的尝试失败?
- 直接用
field_bingo_card_numbers:返回的是每个字段项的完整对象(比如{"value":"27"}),和你的[Int]类型定义不兼容,所以GraphQL报错“期望Int但收到对象”。 - 用
field_bingo_card_numbers.value:这个路径是错误的,因为field_bingo_card_numbers本身是一个数组,你不能直接从父节点(node)上访问数组的value属性,所以解析器找不到可迭代的结果,返回单个null并报错“期望可迭代对象”。
额外调试小技巧
如果不确定字段项的结构,可以在callback里临时添加var_dump($items); exit;来打印返回的字段数据,确认每个项的键名和值的类型,这样能更精准地调整提取逻辑。
内容的提问来源于stack exchange,提问作者Bulent B.
相关产品推荐
相关产品推荐

