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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:32:19