如何在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
相关产品推荐
相关产品推荐

