Laravel 5.4按ID分组统计产品数量及订单过滤查询代码咨询
Laravel 5.4 相关问题解答
问题1:按ID分组统计每个产品的数量
如果是要统计订单中每个产品的下单次数/总数量,最常见的场景是从order_detail表(订单详情表)入手,用Eloquent的分组和聚合查询就能实现。假设你有OrderDetail模型且关联了Product模型,代码示例如下:
use Illuminate\Support\Facades\DB; // 基础版:仅统计每个product_id对应的总下单次数 $productCounts = OrderDetail::select('product_id', DB::raw('count(*) as total_orders')) ->groupBy('product_id') ->get(); // 进阶版:关联产品信息,方便直接查看产品名称等详情 $productCounts = OrderDetail::select('product_id', DB::raw('count(*) as total_orders')) ->groupBy('product_id') ->with('product') // 确保OrderDetail模型中已定义product关联 ->get();
如果你的需求是统计产品的其他数据(比如库存),只需要调整查询的模型和聚合字段即可。另外要注意,Laravel 5.4开启严格模式时,groupBy需要包含所有非聚合字段,上面的写法完全符合要求。
问题2:完善订单过滤查询代码
我帮你补全了代码,同时优化了逻辑,覆盖了日期范围的各种输入场景,以及订单状态的过滤,代码如下:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Carbon\Carbon; // 引入Carbon处理日期,确保时间范围精准 public function index(Request $request) { $dateFrom = $request->get('dateFrom'); $dateTo = $request->get('dateTo'); $status = $request->get('orderState'); // 用Carbon格式化日期,确保包含当天的完整时间区间 if ($dateFrom) { $dateFrom = Carbon::parse($dateFrom)->startOfDay(); } if ($dateTo) { $dateTo = Carbon::parse($dateTo)->endOfDay(); } $orders = (new OrderList()) ->whereHas('orderDetail', function ($query) { $query->where('supplier_id', Auth::guard('supplier')->user()->id); }) ->with(['deliveryList', 'orderDetail']) // 合并关联加载,更简洁高效 // 处理日期范围过滤 ->when($dateFrom && $dateTo, function ($query) use ($dateFrom, $dateTo) { // 替换为你订单表中实际的日期字段,比如order_date $query->whereBetween('created_at', [$dateFrom, $dateTo]); }) ->when($dateFrom && !$dateTo, function ($query) use ($dateFrom) { $query->where('created_at', '>=', $dateFrom); }) ->when(!$dateFrom && $dateTo, function ($query) use ($dateTo) { $query->where('created_at', '<=', $dateTo); }) // 处理订单状态过滤 ->when($status, function ($query) use ($status) { // 替换为你订单表中实际的状态字段,比如order_status $query->where('status', $status); }) // 按创建时间倒序,优先展示最新订单 ->orderBy('created_at', 'desc') ->get(); // 根据实际需求返回视图或JSON数据 return view('supplier.orders.index', compact('orders')); }
关键优化点说明:
- 引入
Carbon处理日期,避免因时间格式问题导致过滤不准确(比如只传日期时,自动覆盖当天00:00:00到23:59:59的区间) - 合并
with为数组写法,一次性加载多个关联,减少数据库查询次数 - 分情况处理日期参数,覆盖了“同时传起止日期、只传开始日期、只传结束日期”三种场景
- 状态过滤仅在
$status有有效值时触发,符合Laravelwhen方法的“条件式查询”设计理念
内容的提问来源于stack exchange,提问作者Yousef Altaf
相关产品推荐
相关产品推荐

