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

Laravel多表数据库查询:MySQL语句转Laravel语法方法问询

把MySQL查询转换为Laravel查询构建器写法

没问题,我帮你把这段MySQL查询转换成Laravel查询构建器的格式,这样就能在Laravel项目里直接使用了。先梳理下你的原查询结构:核心是一个名为T的子查询,从user_group表获取基础字段,然后关联users和user_info表来补充对应的字段。下面是两种实现方式,你可以根据自己的Laravel版本选择:

方式一:使用fromSub(Laravel 5.6+推荐)

这种写法更简洁,Laravel原生支持子查询作为表:

// 先定义子查询T
$subquery = DB::table('user_group')
    ->select([
        'user_group.id',
        't_id',
        'name as t_name',
        'phone as t_phone',
        'address as t_address',
        'Department as t_department',
        'bgroup',
        'sgroup',
        'st_id',
        'st_hospital',
        'st_code',
        'st_art',
        'g_semester'
    ]);

// 主查询关联子查询及其他表
$result = DB::table($subquery, 'T')
    // 关联users表,获取st_name
    ->join('users', 'T.st_id', '=', 'users.id')
    // 关联user_info表,这里假设关联条件是users.id = user_info.user_id,你要根据实际表结构调整
    ->join('user_info', 'users.id', '=', 'user_info.user_id')
    ->select([
        'T.id',
        'T.t_id',
        'T.t_name',
        'T.t_phone',
        'T.t_address',
        'T.t_department',
        'T.bgroup',
        'T.sgroup',
        'T.st_id',
        'users.name as st_name',
        'user_info.phone as st_phone',
        'user_info.address as st_address',
        'user_info.Department as st_department',
        'T.st_hospital',
        'T.st_code',
        'T.st_art',
        'T.g_semester'
    ])
    // 如果原查询有WHERE/ORDER BY等条件,在这里添加,比如:
    // ->where('T.bgroup', '=', 'some_value')
    // ->orderBy('T.id', 'desc')
    ->get();

方式二:使用DB::raw兼容旧版本

如果你的Laravel版本低于5.6,可以用这种方式手动拼接子查询:

// 定义子查询
$subquery = DB::table('user_group')
    ->select([
        'user_group.id',
        't_id',
        'name as t_name',
        'phone as t_phone',
        'address as t_address',
        'Department as t_department',
        'bgroup',
        'sgroup',
        'st_id',
        'st_hospital',
        'st_code',
        'st_art',
        'g_semester'
    ]);

// 主查询
$result = DB::table(DB::raw('(' . $subquery->toSql() . ') as T'))
    // 绑定子查询的参数,避免SQL注入
    ->mergeBindings($subquery)
    ->join('users', 'T.st_id', '=', 'users.id')
    ->join('user_info', 'users.id', '=', 'user_info.user_id')
    ->select([
        'T.id',
        'T.t_id',
        'T.t_name',
        'T.t_phone',
        'T.t_address',
        'T.t_department',
        'T.bgroup',
        'T.sgroup',
        'T.st_id',
        'users.name as st_name',
        'user_info.phone as st_phone',
        'user_info.address as st_address',
        'user_info.Department as st_department',
        'T.st_hospital',
        'T.st_code',
        'T.st_art',
        'T.g_semester'
    ])
    ->get();

注意事项:

  • 我假设了user_info和users的关联条件是users.id = user_info.user_id,你一定要根据自己数据库的实际表结构调整这个关联条件,不然会出错。
  • 如果你的原SQL子查询T还有额外的过滤条件(比如WHERE)或者排序逻辑,直接在$subquery对象上添加对应的方法即可,比如->where('user_group.status', 1)。
  • 所有字段别名都和你原MySQL查询保持一致,确保输出结果和原查询完全匹配。
  • 如果需要分页,把get()换成paginate(10)(数字是每页条数)就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:54:18