在Laravel中如何查询指定日期范围内未产生销售记录的商品?
函数实现逻辑
你可以用 Laravel 提供的whereDoesntHave关联查询方法实现,这个方法可以直接筛选出不存在指定关联条件的模型记录,刚好匹配你需要的「查询指定日期范围内无销售记录的商品」需求,完整代码如下:
private function getDidntSellBetweenDates($days, $user, $filter_by) { $date_from = Carbon::now()->subDays($days); $date_to = Carbon::now(); return Inventory::where('inventory.client_id', $user->client_id) // 筛选「在指定日期范围内没有对应销售记录」的商品 ->whereDoesntHave('sellRecord', function ($query) use ($date_from, $date_to) { $query->whereBetween('created_at', [$date_from, $date_to]); }) // 保留你原有的计数逻辑,无销售时这个字段值会是0 ->withCount(["sellRecord as $filter_by" => function($query) use ($date_from, $date_to) { $query->select(DB::raw("created_at"))->take(1); }]) ->paginate(100); }
逻辑说明
- 首先和原函数一样先计算查询的起止时间范围
whereDoesntHave会自动过滤掉所有在指定时间范围内存在sellRecord关联的Inventory记录,剩下的就是完全没有产生销售的商品- 保留了你原有的
withCount逻辑,方便你统一处理返回字段,无销售时该统计字段值固定为0 - 分页逻辑和原函数保持一致,不需要额外调整
注意:请确认你的Inventory模型已经正确定义了和sellRecord的一对多关联,这个是
whereDoesntHave方法正常工作的前提。
内容的提问来源于stack exchange,提问作者bohdan baida
相关产品推荐
相关产品推荐

