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
相关产品推荐
相关产品推荐

