如何使用Laravel Query Builder实现多字段关联的左连接查询
Laravel 查询构造器实现代码
你需要的查询可以通过带闭包的leftJoin方法实现,写法如下:
// 要匹配的目标ID $listingId = 225678; $data = \Illuminate\Support\Facades\DB::table('l') ->select('l.id', 'l.title', 'is1.similarity') ->leftJoin('is1', function (\Illuminate\Database\Query\JoinClause $join) use ($listingId) { // 包裹第一组AND条件:l.id = is1.listing_id1 且 is1.listing_id2 = 目标ID $join->where(function ($query) use ($listingId) { $query->whereColumn('l.id', 'is1.listing_id1') ->where('is1.listing_id2', $listingId); }) // 包裹第二组AND条件,和第一组用OR连接 ->orWhere(function ($query) use ($listingId) { $query->whereColumn('l.id', 'is1.listing_id2') ->where('is1.listing_id1', $listingId); }); }) ->get();
注意事项
- 对比两个表的字段值必须使用
whereColumn方法,若使用普通where方法,第二个参数会被识别为字符串值而非字段名,导致查询逻辑错误 - 两层闭包的作用是保证两组AND条件的运算优先级和原生SQL完全一致,不会出现逻辑混乱
- 若基于Eloquent模型查询,仅需将
DB::table('l')替换为对应模型的查询起始方法即可,其余语法通用
内容的提问来源于stack exchange,提问作者Pieter Stephenson
相关产品推荐
相关产品推荐

