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

Laravel中间表关联实现:获取公司部门销售及对应关联信息

解决方案

由于你的销售记录直接关联Company_Department中间表的ID,最清晰的处理方式是给这个中间表创建独立模型,以此为桥梁建立所有关联关系。

1. 创建中间表模型 CompanyDepartment.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class CompanyDepartment extends Model
{
    // 若表名是蛇形命名(如company_departments)可省略此配置,Laravel会自动识别
    protected $table = 'Company_Department';

    // 关联所属公司
    public function company()
    {
        return $this->belongsTo(Company::class);
    }

    // 关联所属部门
    public function department()
    {
        return $this->belongsTo(Department::class);
    }

    // 关联该公司部门下的所有销售记录
    public function sales()
    {
        return $this->hasMany(Sale::class, 'company_department_id');
    }
}

2. 更新原有模型

修改 Company.php

class Company extends Model
{
    // 保留原有多对多关联(根据业务需求可选)
    public function departments(): BelongsToMany
    {
        return $this->belongsToMany(Department::class, 'Company_Department');
    }

    // 新增关联到公司-部门中间模型
    public function companyDepartments()
    {
        return $this->hasMany(CompanyDepartment::class, 'company_id');
    }

    // 可选:直接关联该公司的所有销售记录
    public function sales()
    {
        return $this->hasManyThrough(Sale::class, CompanyDepartment::class, 'company_id', 'company_department_id');
    }
}

修改 Department.php

class Department extends Model
{
    // 修正原有关联方法名(多对多对应复数形式)
    public function companies(): BelongsToMany
    {
        return $this->belongsToMany(Company::class, 'Company_Department');
    }

    // 新增关联到公司-部门中间模型
    public function companyDepartments()
    {
        return $this->hasMany(CompanyDepartment::class, 'department_id');
    }

    // 可选:直接关联该部门的所有销售记录
    public function sales()
    {
        return $this->hasManyThrough(Sale::class, CompanyDepartment::class, 'department_id', 'company_department_id');
    }
}

3. 创建 Sale.php 模型

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sale extends Model
{
    protected $table = 'Sales'; // 蛇形命名表可省略此配置

    // 关联对应的公司-部门记录
    public function companyDepartment()
    {
        return $this->belongsTo(CompanyDepartment::class, 'company_department_id');
    }

    // 可选:直接关联所属公司
    public function company()
    {
        return $this->hasOneThrough(Company::class, CompanyDepartment::class, 'id', 'id', 'company_department_id', 'company_id');
    }

    // 可选:直接关联所属部门
    public function department()
    {
        return $this->hasOneThrough(Department::class, CompanyDepartment::class, 'id', 'id', 'company_department_id', 'department_id');
    }
}

实现需求

需求1:获取指定公司部门的销售记录

// 方式1:通过公司部门ID直接查询
$companyDepartment = CompanyDepartment::find($companyDepartmentId);
$sales = $companyDepartment->sales;

// 方式2:通过公司+部门组合定位后查询
$companyDepartment = CompanyDepartment::where('company_id', $companyId)
    ->where('department_id', $departmentId)
    ->first();
$sales = $companyDepartment->sales;

// 方式3:直接从销售模型筛选
$sales = Sale::where('company_department_id', $companyDepartmentId)->get();

需求2:根据销售记录获取对应的公司部门

// 获取单条销售记录的公司部门信息
$sale = Sale::find($saleId);
$companyDepartment = $sale->companyDepartment;

// 直接获取关联的公司和部门
$company = $sale->company;
$department = $sale->department;

内容的提问来源于stack exchange,提问作者Roms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:56:05