Laravel中使用join子查询无法获取正确数据的问题
问题原因
service_galleries表和子查询别名sid的结果集都包含id字段,执行查询时同名字段会被后加载的覆盖,导致你拿到的是sid.id(即关联的服务ID),而非service_galleries表自身的id。
解决方法
方法一:明确指定字段并给冲突字段起别名
给service_galleries.id设置唯一别名,避免和子查询的id冲突,同时按需选择其他需要的字段:
$serviceId = Service::select('id') ->where('provider_id', Auth::user()->id) ->where('is_deleted', 0); $list = DB::table('service_galleries') ->select( 'service_galleries.id as gallery_id', // 给画廊ID起别名 'service_galleries.service_id', 'service_galleries.other_field', // 替换为你需要的其他字段 'sid.id as service_id' // 可选,明确服务ID的别名 ) ->where('is_deleted', 0) ->joinSub($serviceId, 'sid', function ($qry) { $qry->on('service_galleries.service_id', '=', 'sid.id'); }) ->get();
之后通过$item->gallery_id就能获取service_galleries表的ID。
方法二:修改子查询的字段别名
直接在子查询里给服务的id起别名,避免和service_galleries的id重名:
$serviceId = Service::select('id as service_id') ->where('provider_id', Auth::user()->id) ->where('is_deleted', 0); $list = DB::table('service_galleries') ->where('is_deleted', 0) ->joinSub($serviceId, 'sid', function ($qry) { $qry->on('service_galleries.service_id', '=', 'sid.service_id'); }) ->get();
此时查询结果中的id就是service_galleries表的ID,服务ID则为service_id,不会再出现字段覆盖问题。
内容的提问来源于stack exchange,提问作者Ankit Patel
相关产品推荐
相关产品推荐

