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
相关产品推荐
相关产品推荐

