如何将原生SQL改写为Laravel Eloquent查询并修复条件逻辑错误
问题原因&修正方案
你当前的代码存在3个核心逻辑偏差,和原生SQL规则不匹配:
- 惩罚类型筛选全部使用了逻辑与(
where),单字段不可能同时等于4个不同值 - 未对
end字段的两组OR条件做括号分组,导致逻辑优先级错乱,和原生SQL的括号包裹规则不一致 - 缺少
CAST(end AS int)的字段转换声明
修正后代码
use Illuminate\Support\Facades\DB; protected Ban $ban; public function __construct(Ban $ban) { $this->ban = $ban; } public function getAllBans() { return $this->ban ->selectRaw('*, CAST(`end` AS int)') ->whereIn('PunishmentType', ['BAN', 'IP_BAN', 'TEMP_BAN', 'TEMP_IP_BAN']) ->where(function ($query) { $query->where('end', '=', -1) ->orWhere('end', '>', time()); }) ->orderBy('id', 'desc') ->paginate(20); }
逻辑说明
selectRaw方法实现原生SQL的字段类型转换逻辑,和需求完全匹配whereIn方法替代多个OR条件的类型筛选,写法更简洁,逻辑和原生SQL中PunishmentType的四个OR条件完全一致- 传入闭包的
where方法会自动给闭包内的条件套上括号,实现(end > :now OR end = -1)的分组逻辑,避免OR条件优先级超过前面的类型筛选规则,最终查询语句和你给出的原生SQL完全一致
内容的提问来源于stack exchange,提问作者Gooldzik
相关产品推荐
相关产品推荐

