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

如何使用PHP通过Toggl API加载明细报表的全部数据?

如何使用MorningTrain/toggl-api获取Toggl Detail Report的全部数据?

问题描述

我在为客户开发的应用中使用PHP调用Toggl API,需要通过Detail Report加载客户、项目、用户、任务、开始时间、结束时间等全部数据。目前仅能加载50行数据,无法获取所有可用数据。我使用的是GitHub上的MorningTrain/toggl-api工具,当前代码如下:

require 'vendor/autoload.php';
$report = new MorningTrain\TogglApi\TogglReportsApi('my_api_token');
$workspaceId = work_space_id;
$data = $report->getDetailsReport(array('user_agent'=>'test_apps', 'workspace_id'=> $workspaceId));

解决方案

这个问题很常见——Toggl的Detail Report API默认采用分页机制,每页只返回50条数据,这就是你只能拿到部分数据的原因。要获取全部数据,我们需要通过分页遍历的方式,一页一页请求直到所有数据都被获取。

修改后的代码

require 'vendor/autoload.php';

$report = new MorningTrain\TogglApi\TogglReportsApi('my_api_token');
$workspaceId = work_space_id; // 替换为你的实际工作区ID
$allReportData = [];
$currentPage = 1;
$perPage = 200; // Toggl API允许的最大每页条数,减少请求次数

do {
    // 请求当前页的详情报告数据
    $pageData = $report->getDetailsReport([
        'user_agent' => 'test_apps',
        'workspace_id' => $workspaceId,
        'page' => $currentPage,
        'per_page' => $perPage
    ]);

    // 合并当前页数据到总数据集
    if (!empty($pageData)) {
        $allReportData = array_merge($allReportData, $pageData);
        $currentPage++;
    } else {
        // 无更多数据,终止循环
        break;
    }

    // 如果当前页数据量小于每页上限,说明已到最后一页
    if (count($pageData) < $perPage) {
        break;
    }

    // 可选:添加短暂延迟避免触发API限流
    // sleep(1);

} while (true);

// $allReportData 现在包含所有的详情报告数据
// 可以根据需求处理这些数据,比如存入数据库或返回给前端
print_r($allReportData);

关键说明

  • 分页参数:通过添加page(当前页码)和per_page(每页条数)参数,实现分页请求。Toggl API允许per_page最大设为200,这样能减少总请求次数,提升效率。
  • 循环终止条件:当某一页返回空数据,或者返回的数据条数小于per_page时,说明已经获取完所有数据,终止循环。
  • API限流注意:如果你的数据量极大,建议在每次请求之间加入短暂延迟(比如sleep(1)),避免触发Toggl的API请求频率限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:47:19