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

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内置的关联计数能力完成查询,代码可读性更强:

  1. 定义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');
    }
}
  1. 执行查询
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:06:03