如何在Laravel查询构建器中比较两个聚合字段
解决方案:筛选杯架数少于座椅数的车辆
你可以通过havingRaw方法直接在SQL的HAVING子句中写入自定义比较逻辑,实现两个聚合字段的对比:
Car::query() ->withCount('seats') ->withCount('cupholders') ->havingRaw('cupholders_count < seats_count') ->get();
或者也可以用having配合DB::raw实现,效果完全一致:
use Illuminate\Support\Facades\DB; Car::query() ->withCount('seats') ->withCount('cupholders') ->having('cupholders_count', '<', DB::raw('seats_count')) ->get();
原理说明
withCount生成的seats_count和cupholders_count属于查询结果中的聚合计算列,where子句无法直接引用这类聚合结果(因为WHERE在聚合计算前执行)。而HAVING子句是在聚合计算完成后执行,正好适合用来筛选聚合结果。
havingRaw允许你直接编写原生SQL表达式,能灵活对比两个聚合字段;用DB::raw包裹seats_count,是为了告诉Laravel这是一个列名而非静态参数,避免被当作字符串处理。
内容的提问来源于stack exchange,提问作者mniess
相关产品推荐
相关产品推荐

