如何在Xero API中按Tracking Option筛选发票与账单?
在Xero API中通过Tracking Option筛选发票和账单的问题
我正尝试在Xero API中通过Tracking Option筛选发票和账单,以显示关联项目的成本,该项目信息设置在账单或发票的Tracking Category/Option中。返回的对象结构如下:
["tracking"]=> array(1) { [0]=> object(XeroAPI\XeroPHP\Models\Accounting\LineItemTracking)#18755 (1) { ["container":protected]=> array(4) { ["tracking_category_id"]=> string(36) "8a29ae32-c0f1-43b4-a4aa-09293ad182be" ["tracking_option_id"]=> NULL ["name"]=> string(7) "Project" ["option"]=> string(4) "2455" } } }
我曾尝试在Where语句中使用LineItems、LineItemTracking等进行筛选,例如:
$where = "Type==\"ACCPAY\"&&tracking_category_option==\"' . $projectNo . '\"";
但均未成功。请问有人知道如何实现Tracking Category或Option的筛选,或是有可行的替代方案吗?
解决方案
1. 正确的API筛选语法
Xero API的WHERE子句需要通过LineItems.Tracking.Any()来嵌套匹配跟踪记录,以下是两种可行的写法:
- 通过Tracking分类名称和选项值筛选:
$where = "Type == 'ACCPAY' && LineItems.Tracking.Any(Name == 'Project' && Option == '" . $projectNo . "')";
- 通过Tracking分类ID和选项值筛选(更精准,避免名称冲突):
$categoryId = "8a29ae32-c0f1-43b4-a4aa-09293ad182be"; $where = "Type == 'ACCPAY' && LineItems.Tracking.Any(TrackingCategoryID == '" . $categoryId . "' && Option == '" . $projectNo . "')";
核心是用Any()方法遍历行项目下的所有跟踪条目,匹配对应的分类和选项条件。
2. 筛选注意事项
- 匹配规则大小写敏感,要确保
Name和Option的值与Xero后台配置完全一致; - 若
TrackingOptionID有值,优先用该字段替代Option进行筛选,避免不同分类下出现同名选项的误匹配; - 确认请求端点正确:账单和发票都通过
/api.xro/2.0/Invoices接口获取,Type参数区分ACCPAY(账单)和ACCREC(发票)。
3. 本地过滤替代方案
如果API端筛选仍存在问题,可先批量拉取目标类型的记录,再在本地代码中过滤:
// 获取所有ACCPAY类型的账单 $invoices = $xero->load('Accounting\\Invoice')->where("Type == 'ACCPAY'")->execute(); // 本地筛选匹配指定项目的记录 $filteredResults = []; foreach ($invoices as $invoice) { foreach ($invoice->getLineItems() as $lineItem) { foreach ($lineItem->getTracking() as $tracking) { if ($tracking->getName() === 'Project' && $tracking->getOption() === $projectNo) { $filteredResults[] = $invoice; break 2; // 找到匹配项后跳出多层循环,提升效率 } } } }
这种方式适合数据量较小的场景,无需依赖API端的筛选能力,稳定性更强。
内容的提问来源于stack exchange,提问作者TomC
相关产品推荐
相关产品推荐

