如何在Laravel中使用自连接?将指定SQL转换为查询构造器并解决报错
如何在Laravel中实现自连接并转换指定SQL?
嘿,我来帮你搞定这个问题!首先得先理清你代码里的问题,再给出正确的写法:
你当前代码的问题
你的原始SQL是通过子查询找出重复的密码,再关联原表筛选指定邮箱的记录,但你的代码有几个关键错误:
- 直接连接了不存在的
temp表——这个temp是子查询生成的临时表,不是数据库里实际存在的表,得先构建子查询再连接 groupBy和having的位置错了,这俩逻辑应该放在子查询里,而非主查询- 字段选择有冗余(比如
user_id不在你原始SQL里),而且没明确字段归属,容易引发歧义
正确的Laravel查询构造器写法
下面是对应你原始SQL的正确实现:
// 先构建子查询:找出重复出现的密码 $duplicatePasswords = DB::table('users') ->select('password') ->groupBy('password') ->havingRaw('COUNT(password) > 1'); // 主查询:关联子查询结果,筛选指定邮箱的用户 $targetUser = User::select('users.name', 'users.email', 'users.password') ->joinSub($duplicatePasswords, 'temp', function ($join) { $join->on('users.password', '=', 'temp.password'); }) ->where('users.email', Input::get('username')) // 注意:这里建议先验证输入的合法性 ->get();
代码说明
- 子查询部分:
$duplicatePasswords对应你原始SQL里的临时表temp,用havingRaw直接写聚合条件,避免Laravel查询构造器的语法限制 - 子查询连接:用Laravel提供的
joinSub方法,把子查询结果作为临时表temp和users表做内连接,指定密码匹配的连接条件 - 筛选与字段:明确指定
users表的字段(防止字段歧义),再添加邮箱筛选条件
另外你提到的base view not found错误,这个和查询逻辑无关,是视图文件缺失导致的!检查下你返回视图的代码,确保对应的视图文件存在于resources/views目录下哦。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

