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

