如何通过Laravel Eloquent实现两组独立左连接的关联查询?
使用Laravel Eloquent实现指定SQL查询
第一步:定义模型及关联
先创建对应数据表的模型(遵循Laravel单数大驼峰命名规范),并配置关联关系:
Aa 模型(对应aa表)
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class Aa extends Model { protected $table = 'aa'; public $timestamps = false; // 表无时间戳字段时需添加 // 关联Bb模型 public function bb(): BelongsTo { return $this->belongsTo(Bb::class, 'bb_id', 'id'); } // 关联Xx模型 public function xx(): BelongsTo { return $this->belongsTo(Xx::class, 'xx_id', 'id'); } }
Bb 模型(对应bb表)
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Bb extends Model { protected $table = 'bb'; public $timestamps = false; }
Xx 模型(对应xx表)
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class Xx extends Model { protected $table = 'xx'; public $timestamps = false; // 关联Zz模型 public function zz(): BelongsTo { return $this->belongsTo(Zz::class, 'zz_id', 'id'); } }
Zz 模型(对应zz表)
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Zz extends Model { protected $table = 'zz'; public $timestamps = false; }
第二步:实现查询逻辑
提供两种实现方式,可根据场景选择:
方式一:Eloquent关联预加载(推荐)
利用Eloquent的关联预加载特性,自动处理左连接逻辑,代码更符合ORM风格:
use App\Models\Aa; $results = Aa::with(['bb', 'xx.zz']) ->get();
方式二:Query Builder手动拼接Join(贴近原生SQL)
完全复刻原生SQL的写法,适合需要精细控制查询结构的场景:
use Illuminate\Support\Facades\DB; $results = DB::table('aa') ->leftJoin('bb', 'aa.bb_id', '=', 'bb.id') ->leftJoin('xx', 'aa.xx_id', '=', 'xx.id') ->leftJoin('zz', 'xx.zz_id', '=', 'zz.id') ->select('*') ->get();
验证生成的SQL
若要确认生成的SQL是否与预期一致,可在查询后调用->toSql()方法查看:
$sql = Aa::with(['bb', 'xx.zz'])->toSql(); // 或Query Builder版本 $sql = DB::table('aa') ->leftJoin('bb', 'aa.bb_id', '=', 'bb.id') ->leftJoin('xx', 'aa.xx_id', '=', 'xx.id') ->leftJoin('zz', 'xx.zz_id', '=', 'zz.id') ->select('*') ->toSql();
内容的提问来源于stack exchange,提问作者Raymond Tey
相关产品推荐
相关产品推荐

