You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:42:08