Laravel9多条件关联两张表:查询符合指定条件的coletes数据
问题分析与解决方案
你的查询存在两个核心问题:
- 字段引用错误:
orWhere中直接写'invoices.storno_id'会被当成字符串字面量,而非数据库字段,导致条件永远不成立。 - 关联逻辑与条件优先级问题:原
leftJoin仅关联了coletes.invoice_id = invoices.id,无法匹配coletes.invoice_id = invoices.storno_id的关联关系;同时未对OR条件进行分组,导致逻辑不符合预期。
正确查询写法
方式一:调整关联条件,直接关联两种匹配情况
$data = DB::table('coletes') ->join('invoices', function ($join) { // 关联条件:coletes的invoice_id等于invoices的id 或 storno_id $join->on('coletes.invoice_id', '=', 'invoices.id') ->orOn('coletes.invoice_id', '=', 'invoices.storno_id'); }) ->where('coletes.invoice_id', '=', $id) ->get();
方式二:使用whereExists验证关联关系
如果只需要获取符合条件的coletes记录,不需要invoices表的字段,可以用子查询验证存在性:
$data = DB::table('coletes') ->where('coletes.invoice_id', '=', $id) ->whereExists(function ($query) use ($id) { $query->select(DB::raw(1)) ->from('invoices') ->where(function ($q) use ($id) { $q->where('invoices.id', '=', $id) ->orWhere('invoices.storno_id', '=', $id); }); }) ->get();
原查询问题详解
- 原代码中
orWhere('coletes.invoice_id','=','invoices.storno_id')等价于判断coletes.invoice_id是否等于字符串"invoices.storno_id",而非匹配invoices表的storno_id字段,需用字段引用(如在join的orOn中,或用DB::raw('invoices.storno_id'))。 - 原
leftJoin仅关联了coletes.invoice_id = invoices.id,导致coletes.invoice_id等于invoices.storno_id的记录无法与invoices表建立关联,后续条件自然无法匹配。
内容的提问来源于stack exchange,提问作者Catalin
相关产品推荐
相关产品推荐

