Laravel 9 Query Builder转换MS Access SQL语句需求
Access SQL转Laravel 9 Query Builder实现
原Access SQL语句
SELECT tblSU.Site, tlkpSUDesc.ESR_SUcat, tlkpSUDesc.ESR_SUcatdisp, tlkpSUDesc.SUDesc, tlkpSUTyp.SUTyp, tblSU.SUNum FROM tlkpSUTyp RIGHT JOIN (tlkpSUDesc RIGHT JOIN tblSU ON tlkpSUDesc.SUDescCode = tblSU.SUDescCode) ON tlkpSUTyp.SUTypCode = tblSU.SUTypCode WHERE (((tblSU.Site)='[Site参数]') AND ((tlkpSUDesc.ESR_SUcat)='[Crit参数]') AND (Not (tblSU.SUTypCode)='GEN')) ORDER BY tblSU.Site, tlkpSUDesc.ESR_SUcatdisp, tblSU.SUDescCode, CDbl(IIf(InStr([tblSU]![SUNum],'-'),Left([tblSU]![SUNum],Len([tblSU]![SUNum])-2),[tblSU]![SUNum]))
Laravel 9 Query Builder实现代码
直接使用DB门面构建查询,无需模型:
use Illuminate\Support\Facades\DB; $site = request('Site'); $crit = request('Crit'); $query = DB::table('tblSU') // 关联tlkpSUDesc(RIGHT JOIN) ->rightJoin('tlkpSUDesc', 'tblSU.SUDescCode', '=', 'tlkpSUDesc.SUDescCode') // 关联tlkpSUTyp(RIGHT JOIN) ->rightJoin('tlkpSUTyp', 'tblSU.SUTypCode', '=', 'tlkpSUTyp.SUTypCode') // 指定查询字段 ->select([ 'tblSU.Site', 'tlkpSUDesc.ESR_SUcat', 'tlkpSUDesc.ESR_SUcatdisp', 'tlkpSUDesc.SUDesc', 'tlkpSUTyp.SUTyp', 'tblSU.SUNum' ]) // 筛选条件(参数绑定避免注入) ->where('tblSU.Site', '=', $site) ->where('tlkpSUDesc.ESR_SUcat', '=', $crit) ->where('tblSU.SUTypCode', '!=', 'GEN') // 排序规则,原生表达式兼容Access函数 ->orderBy('tblSU.Site') ->orderBy('tlkpSUDesc.ESR_SUcatdisp') ->orderBy('tblSU.SUDescCode') ->orderByRaw("CDbl(IIf(InStr(tblSU.SUNum,'-'),Left(tblSU.SUNum,Len(tblSU.SUNum)-2),tblSU.SUNum))"); // 执行查询获取结果集 $results = $query->get();
核心要点说明
- JOIN逻辑对齐:按原SQL嵌套RIGHT JOIN的顺序,先关联
tlkpSUDesc再关联tlkpSUTyp,确保数据关联逻辑一致。 - 安全参数处理:直接绑定请求参数,替代原SQL的字符串拼接,彻底避免SQL注入风险。
- 原生函数兼容:原Access特有的
CDbl、IIf等函数通过orderByRaw直接写入原生SQL片段,保证排序逻辑和原语句完全一致。 - 无模型依赖:全程基于
DB门面操作,无需定义任何Eloquent模型。
内容的提问来源于stack exchange,提问作者stanhook
相关产品推荐
相关产品推荐

