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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:09:15