Laravel中Lighthouse GraphQL如何从外部API获取分页数据?
Laravel Lighthouse 实现外部API数据的GraphQL分页返回
核心思路
Lighthouse默认的@paginate指令依赖Eloquent模型/查询构建器,无法直接适配外部API的分页数据。因此需要自定义查询解析器,手动处理分页参数、请求外部API,再封装成符合GraphQL规范的分页返回结构。
步骤1:定义GraphQL Schema
在schema.graphql里声明查询、数据类型和分页返回结构:
# 主查询 type Query { # 接收page(默认1)和count(默认10)参数,返回自定义分页结果 items(page: Int = 1, count: Int = 10): ItemPaginatedResult! @field(resolver: "App\\GraphQL\\Queries\\Items@resolve") } # 单个数据项的类型(根据外部API字段调整) type Item { id: ID! name: String! description: String # 其他字段按需添加 } # 自定义分页返回结构 type ItemPaginatedResult { data: [Item!]! # 当前页数据列表 current_page: Int! # 当前页码 last_page: Int! # 最后一页页码 total: Int! # 总数据量 per_page: Int! # 每页条数 }
步骤2:编写自定义查询解析器
修改app/GraphQL/Queries/Items.php,实现外部API请求和分页数据封装:
<?php namespace App\GraphQL\Queries; use Illuminate\Support\Facades\Http; use Nuwave\Lighthouse\Support\Contracts\GraphQLContext; use GraphQL\Type\Definition\ResolveInfo; class Items { public function resolve($root, array $args, GraphQLContext $context, ResolveInfo $info) { // 提取分页参数,设置默认值 $page = $args['page'] ?? 1; $perPage = $args['count'] ?? 10; // 请求外部API,注意参数名要和外部API要求一致(比如有的用page/limit,有的用offset/limit) $apiResponse = Http::get('https://your-external-api.com/items', [ 'page' => $page, 'limit' => $perPage, ])->json(); // 按照schema定义的结构返回数据,字段名要严格匹配 return [ 'data' => $apiResponse['data'], 'current_page' => $apiResponse['current_page'], 'last_page' => $apiResponse['last_page'], 'total' => $apiResponse['total'], 'per_page' => $apiResponse['per_page'], ]; } }
步骤3:测试验证
在GraphQL Playground里发起测试请求:
query GetItems { items(page: 2, count: 15) { data { id name } current_page last_page total per_page } }
常见问题说明
- 之前用
@paginate报错:因为@paginate要求返回Eloquent查询构建器,外部API数据不属于Eloquent模型体系,所以直接使用会触发类型不匹配错误。 - 参数/返回值类型错误:确保schema里的参数类型(Int)和解析器接收的参数一致,返回的每个字段都严格对应
ItemPaginatedResult的定义,不能缺字段或类型不符。
内容的提问来源于stack exchange,提问作者Petro Gromovo
相关产品推荐
相关产品推荐

