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

Laravel:用whereHas()筛选可用Slots占比超50%的Block

嘿,我来帮你搞定这个查询需求!针对你要筛选出已预订Slots占比不足50%的Block,用Laravel Eloquent可以很简洁地实现,这里有个实用的方案:

首先确保你的Block模型已经定义了和Slot的关联关系:

// app/Models/Block.php
public function slots()
{
    return $this->hasMany(Slot::class);
}

接下来就可以用withCount来统计每个Block的总Slots数和已预订Slots数,再通过havingRaw来判断占比条件:

$blocks = Block::withCount([
    // 统计当前Block下的总Slots数量
    'slots',
    // 统计当前Block下已预订(status=1)的Slots数量,别名booked_slots_count
    'slots as booked_slots_count' => function ($query) {
        $query->where('status', 1);
    }
])
// 可选:排除没有任何Slots的Block,避免除数为0的情况
->where('slots_count', '>', 0)
// 判断已预订占比是否小于0.5
->havingRaw('booked_slots_count / slots_count < 0.5')
->get();

这样查询出来的$blocks就是所有符合条件的Block实例,每个实例还会附带slots_count和booked_slots_count两个属性,方便你后续使用。

如果你的场景不需要排除无Slots的Block,直接去掉->where('slots_count', '>', 0)这一行就可以了。要是想把无Slots的Block也纳入结果,还可以调整条件为havingRaw('(booked_slots_count / slots_count) < 0.5 OR slots_count = 0')。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:51:35