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

如何将含关联表的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();

代码说明

  1. 表别名处理:用from('order as a')给order表设置别名a,和原SQL保持一致
  2. 关联用户表:通过join('users as b', 'b.id', '=', 'a.user_id')完成表关联,对应原SQL的JOIN逻辑
  3. 条件包裹:把三个OR条件放在同一个where闭包里,确保逻辑和原SQL完全匹配:(LPAD(...) LIKE ...) OR (b.name LIKE ...) OR (a.order_detail LIKE ...)
  4. SQL函数使用:用DB::raw()来调用SQL的LPAD函数,因为这是数据库层面的操作,不能用PHP的str_pad替代

这样写出来的查询构造器执行后,生成的SQL和你给出的原SQL完全一致,同时符合Laravel的语法规范~

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:35:52