如何将含关联表的SQL语句转换为Laravel查询构造器?
将SQL转换为Laravel查询构造器的解决方案
没问题!我来帮你把这条SQL转换成Laravel的查询构造器写法,顺便修正你代码里的几个小问题~
原SQL语句
SELECT * FROM `order` AS a JOIN `users` AS b ON b.id = a.user_id WHERE LPAD(a.id,6,'0') LIKE '%keyword%' OR b.name LIKE '%keyword%' OR a.order_detail LIKE '%keyword%'
你的尝试思路
你提到用orWhere的思路是对的,但关联表的处理和部分语法需要调整。你原来的代码里存在几个问题:
- 用PHP的
str_pad处理数据库字段是错误的,应该用SQL的LPAD函数 - 关联表需要先执行
join操作,而不是放在orWhere闭包里 - 错误地引用了
Order.name,实际应该是关联的users表的name字段
正确的查询构造器写法
Order::from('order as a') ->join('users as b', 'b.id', '=', 'a.user_id') ->where(function ($query) use ($keyword) { $query->where(DB::raw('LPAD(a.id, 6, "0")'), 'LIKE', "%{$keyword}%") ->orWhere('b.name', 'LIKE', "%{$keyword}%") ->orWhere('a.order_detail', 'LIKE', "%{$keyword}%"); }) ->get();
代码说明
- 表别名处理:用
from('order as a')给order表设置别名a,和原SQL保持一致 - 关联用户表:通过
join('users as b', 'b.id', '=', 'a.user_id')完成表关联,对应原SQL的JOIN逻辑 - 条件包裹:把三个OR条件放在同一个
where闭包里,确保逻辑和原SQL完全匹配:(LPAD(...) LIKE ...) OR (b.name LIKE ...) OR (a.order_detail LIKE ...) - SQL函数使用:用
DB::raw()来调用SQL的LPAD函数,因为这是数据库层面的操作,不能用PHP的str_pad替代
这样写出来的查询构造器执行后,生成的SQL和你给出的原SQL完全一致,同时符合Laravel的语法规范~
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

