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

如何将原生SQL改写为Laravel Eloquent查询并修复条件逻辑错误

问题原因&修正方案

你当前的代码存在3个核心逻辑偏差,和原生SQL规则不匹配:

  1. 惩罚类型筛选全部使用了逻辑与(where),单字段不可能同时等于4个不同值
  2. 未对end字段的两组OR条件做括号分组,导致逻辑优先级错乱,和原生SQL的括号包裹规则不一致
  3. 缺少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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 14:54:05