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

如何在Picqer Exact API中使用PHP生成器获取全量条目数据

Picqer Exact API 基于Generator获取全量条目实现方案

Picqer 提供的 Exact PHP SDK 自带的 Generator 相关方法本身已经内置了自动分页逻辑,不需要手动处理接口默认单页60条的限制,原有代码存在无效调用和多余封装的问题,调整即可实现全量拉取。

原有代码问题

  • 单独调用$item->getAsGenerator()属于无效操作:该方法本身返回Generator对象,未接收返回值时不会产生任何效果
  • 自定义的getLines()包装函数完全多余:filterAsGenerator返回值本身就是可直接遍历的Generator对象,不需要额外套一层yield做转发
  • 不需要手动实现分页逻辑:SDK内部的Generator方法已经处理了分页游标,遍历过程中会自动请求下一页数据,直到所有匹配数据拉取完成

正确实现代码

// 初始化Item实体实例
$item = new \Picqer\Financials\Exact\Item($connection);

// 传入过滤条件获取全量数据Generator,SDK自动处理单页60条的分页逻辑
$itemGenerator = $item->filterAsGenerator("Class_01 eq 'test' or Class_01 eq 'test2' or Class_01 eq 'test3'");

// 直接遍历即可,遍历过程中SDK会在当前页数据读完后自动拉取下一页,直到所有数据返回
foreach ($itemGenerator as $index => $product_item_line) {
    // 此处编写单条条目的业务处理逻辑即可
}

可选优化配置

  • 可通过$item->setPageSize(1000)调整单页拉取条数,Exact接口单页最大支持返回1000条,调整后可减少接口请求次数,Generator自动翻页逻辑不受影响
  • 若需要指定返回字段、排序规则,可在filterAsGenerator第二个参数传入OData配置数组,示例:
    $itemGenerator = $item->filterAsGenerator(
        "Class_01 eq 'test' or Class_01 eq 'test2' or Class_01 eq 'test3'",
        [
            '$select' => 'ID,Code,Name,Class_01', // 指定返回字段减少传输量
            '$orderby' => 'Code asc' // 指定排序规则
        ]
    );
    
  • 注意:禁止直接对返回的Generator调用iterator_to_array()转数组,数据量过大时会直接占满内存,Generator的核心优势就是逐行处理时内存占用恒定,不会随全量数据上涨。

内容的提问来源于stack exchange,提问作者Thenewebdev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:24:28