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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:55:23