Laravel三张关联表join查询并统计table3关联记录数问题求助
Laravel 三表关联查询+关联计数实现方案
实现说明
已知table1与table2为一对一关联、table1与table3为一对多关联,以下提供两种常用实现方式:
方案1:查询构造器直接实现
直接编写join逻辑完成查询和统计,适合临时查询场景:
use Illuminate\Support\Facades\DB; $result = DB::table('table1') // 关联table2取2name字段 ->join('table2', 'table1.id', '=', 'table2.table1_id') // 左关联table3避免无关联数据时丢失table1记录 ->leftJoin('table3', 'table1.id', '=', 'table3.table1_id') ->select( 'table1.name', 'table2.2name', // 统计table3关联记录数 DB::raw('COUNT(table3.id) as count3name') ) // 分组聚合,若MySQL开启严格模式,需把select中非聚合字段全部加入groupBy ->groupBy('table1.id', 'table1.name', 'table2.2name') ->get();
查询结果和要求的输出完全一致。
方案2:Eloquent关联实现(更符合Laravel开发规范)
先在模型中定义关联关系,再利用Laravel内置的关联计数能力完成查询,代码可读性更强:
- 定义Table1模型关联
// app/Models/Table1.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Table1 extends Model { protected $table = 'table1'; // 和table2的一对一关联 public function table2() { return $this->hasOne(Table2::class, 'table1_id'); } // 和table3的一对多关联 public function table3() { return $this->hasMany(Table3::class, 'table1_id'); } }
- 执行查询
use App\Models\Table1; $result = Table1::query() // 预加载table2关联 ->with('table2') // 统计table3关联数,别名count3name ->withCount('table3 as count3name') ->get() // 格式化输出字段 ->map(fn ($item) => [ 'name' => $item->name, '2name' => $item->table2->2name, 'count3name' => $item->count3name ]);
内容的提问来源于stack exchange,提问作者pbn skd
相关产品推荐
相关产品推荐

