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

Laravel左连接查询无结果默认返回0 加日期筛选后结果为空如何解决

问题原因

你当前的错误是因为对左连接的右表直接使用全局WHERE条件导致的:左连接查询中,没有匹配到统计结果的活动对应的campaigns_products_results表所有字段均为NULL,你直接加全局日期筛选会把这部分数据全部过滤,原本要保留的「无统计结果返回0」的活动就会被排除,最终出现返回空或者数据不全的问题。

解决方案

把日期筛选条件从全局WHERE移到左连接的ON子句中,仅筛选右表中符合日期范围的记录,不会过滤左表的活动数据,代码示例如下:

$list = DB::table('campaigns')
    ->leftJoin('campaigns_products_results', function ($join) {
        // 关联条件 + 日期范围筛选都写在join的闭包里
        $join->on('campaigns_products_results.campaign_id', '=', 'campaigns.id')
             // 筛选昨日数据的写法
             ->whereDate('campaigns_products_results.created_at', Carbon::yesterday());
             // 如果需要筛选近7天,替换上面的whereDate为下面的写法即可
             // ->whereBetween('campaigns_products_results.created_at', [Carbon::now()->subDays(6)->startOfDay(), Carbon::yesterday()->endOfDay()])
    });

同时你原来的统计逻辑可以简化,CASE WHEN的判断可以直接用COALESCE函数实现,并且需要补充GROUP BY分组逻辑,否则统计结果会合并成一行:

$list->select('campaigns.*', 
        DB::raw('COALESCE(SUM(campaigns_products_results.total_views), 0) AS total_views')
    )
    ->groupBy('campaigns.id');

如果你的数据库开启了严格模式分组报错,把select中的campaigns.*替换为具体需要查询的活动字段,全部加入groupBy即可。

内容的提问来源于stack exchange,提问作者jkoopman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:27:04