我正在尝试实现一项功能,但我认为关系无法使用该功能。
一个用户可能有很多公司,而公司可能有很多用户。它们通过company_employees数据透视表连接。
数据透视表如下:
company_id, user_id, position_id
我希望有一个选择来获取具有相关职位的公司员工。
假设有公司:
和用户
还有2个职位:
John Doe是这两家公司的雇员,职位不同。
company_id | user_id | position_id
1 1 1
2 1 2
我该如何制作
$company = Company::first();
$company->employees()->with('position')->get();
仅返回与第一用户相关的与第一公司相关的职位作为HasOne关系?
答案 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();