Laravel:仅为相关模型加载嵌套关系

时间:2019-03-28 09:33:00

标签: php laravel

我正在尝试实现一项功能,但我认为关系无法使用该功能。

一个用户可能有很多公司,而公司可能有很多用户。它们通过company_employees数据透视表连接。

数据透视表如下:

company_id, user_id, position_id

我希望有一个选择来获取具有相关职位的公司员工。

假设有公司:

  1. “ Foo Company”
  2. “律师事务所”

和用户

  1. “约翰·多伊”

还有2个职位:

  1. “前端开发人员”
  2. “后端开发人员”

John Doe是这两家公司的雇员,职位不同。

company_id | user_id | position_id
1            1         1
2            1         2

我该如何制作

$company = Company::first();
$company->employees()->with('position')->get();

仅返回与第一用户相关的与第一公司相关的职位作为HasOne关系?

3 个答案:

答案 0 :(得分:1)

 Company.php     
    public function user() {
         return $this->belongsToMany('App\User', 'company_employees ', 'company_id', 
                    'user_id');
    }

    User.php
      public function position() {
            return $this->hasMany('App\Position');
        }


    $company = Company::with('user.position')->get();

答案 1 :(得分:0)

您可以这样做:

 foreach($company->employees as $employee){

     $employee->position_id = $employee->pivot->position_id;
     $collect[] = $employee;
 }

$ collect包含所有具有职位ID的员工详细信息,您可以在其中调用职位关系。

在员工和公司类别中,您定义类似的关系

Employee.php :

 public function company(){
    return $this->belongsToMany(Company::class, 'pivot_table_name','company_id','employee_id')
        ->withPivot("position_id");
}

Company.php :

 public function employee(){
    return $this->belongsToMany(Employee::class, 'pivot_table_name','company_id','employee_id')
        ->withPivot("position_id");
}

答案 2 :(得分:0)

我认为您只能通过使用自定义with函数来实现。

未经测试的代码:

$company = Company::first();
$company->employees()->with([
  'position' => function ($query) use ($company) {
    $query->where('company_id', $company->id);
  }
])->get();

签出documentation