Laravel关联查询未过期Deal时返回全部关联Deal的问题
解决Laravel关联查询中只返回未过期Deal的问题
你遇到的问题核心是:whereRelation只负责筛选存在有效Deal的分类,但with('deals')会加载该分类下的所有Deal,不管是否过期。要同时实现「只返回有有效Deal的分类」和「每个分类只加载未过期的Deal」,需要给关联加载添加约束条件。
修改后的代码如下:
use Carbon\Carbon; $today = Carbon::today(); $deals = DealCategory::where('name', '!=', 'Today Deal') // 筛选出至少有一个有效Deal的分类 ->whereRelation('deals', 'start_date', '<=', $today) ->whereRelation('deals', 'expiry_date', '>=', $today) // 加载关联时,只筛选未过期的Deal ->with([ 'deals' => function ($query) use ($today) { $query->where('start_date', '<=', $today) ->where('expiry_date', '>=', $today); }, 'deals.deal_images', 'deals.deal_products', 'deals.deal_products.product', 'deals.rating' ]) ->latest() ->paginate(12); return response()->json([ 'Deals' => $deals, 'Date' => Carbon::now(), 'status' => 'success' ], 200);
关键修改点:
- 用
Carbon::today()统一日期值,避免重复编写date('Y-m-d'),同时兼容Laravel的时区配置 - 在
with方法中对deals关联使用闭包,添加和whereRelation一致的日期筛选条件,确保加载的Deal都是未过期的 - 其他关联(如
deal_images、deal_products等)会自动跟随筛选后的deals加载,不会包含过期Deal的关联数据
内容的提问来源于stack exchange,提问作者faisal mumtaz
相关产品推荐
相关产品推荐

