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

Laravel/PHP可选日期条件筛选查询无结果问题排查

问题排查与修复方案

核心错误点

  • 数据结构错误:当前$ordersData是「订单集合的数组」,不是扁平化的订单列表。遍历工作组时你把collect($workgroup->analyticsOrders)整个作为元素push到数组里,后续对created_at字段的过滤是作用在集合元素上,自然匹配不到任何数据。
  • 重复包裹集合冗余:每次过滤都重复用collect()包裹$ordersData,会反复重置结构,进一步导致匹配失败。
  • 日期类型未对齐:请求传入的start-date/end-date是字符串格式,和created_at的Carbon/datetime字段类型不匹配,直接比对会出现格式兼容问题。
  • 过滤逻辑冗余:不需要拆分「同时传两个参数」「仅传一个参数」的分支,单独判断每个参数存在就追加过滤即可,减少逻辑出错概率。

修复后代码

public function getAnalyticsData(Request $request): JsonResponse
{
    $user = $request->user();
    $data = collect();

    $dataType = $request->input('data-type');
    $suppliers = $request->input('suppliers');
    $workgroupId = $request->input('workgroup-id');
    $costs = $request->input('costs');

    if ($dataType === 'orders') {
        // 初始化空集合存储订单,避免数组嵌套问题
        $ordersData = collect();
        foreach ($user->workgroups as $workgroup) {
            if ($workgroup->id == $workgroupId) {
                // 直接合并订单到集合,得到一维订单列表
                $ordersData = $ordersData->merge($workgroup->analyticsOrders);
            }
        }

        // 分别判断日期参数,存在就追加过滤,同时转成Carbon对齐类型
        if ($request->filled('start-date')) {
            $startDate = \Carbon\Carbon::parse($request->input('start-date'))->startOfDay();
            $ordersData = $ordersData->where('created_at', '>=', $startDate);
        }
        if ($request->filled('end-date')) {
            $endDate = \Carbon\Carbon::parse($request->input('end-date'))->endOfDay();
            $ordersData = $ordersData->where('created_at', '<=', $endDate);
        }

        $data->put('analyticsData', $ordersData);
        // 补充原代码遗漏的返回逻辑即可
        return response()->json($data);
    }
    // 其他dataType对应逻辑可在此补充
}

额外优化建议

如果订单数据量较大,不要在集合层面做过滤,改成在数据库查询阶段加where条件,性能会提升很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:24:04