版本:Laravel 5.4
我有3个型号
型号:员工
protected $fillable = ['name'];
public function emails(){
return $this->belongsToMany('App\Email')->using('App\EmailEmployee');
}
型号:电子邮件
protected $fillable = ['username'];
public function employees(){
return $this->belongsToMany('App\Employee')->using('App\EmailEmployee');
}
每个员工都有许多电子邮件访问权限,并且电子邮件分配给许多员工。但是我在email_employee
表中还有一列
email_id (emails table)
employee_id (employees table)
assigned_by (employees table)
如何使assigned_by
列与employees table
之间的关系
数据透视模型
use \Illuminate\Database\Eloquent\Relations\Pivot;
class EmailEmployee extends Pivot{
public function assignedBy(){
return $this->belongsTo('App\Employee');
}
}
我尝试过
$email = Email::find(1);
dd($email->employee[0]->pivot->assignedBy);
但不起作用
答案 0 :(得分:1)
要解决您的问题,您应该考虑在->using()
方法上使用belongsToMany
方法。
此链接中的“定义自定义中间表模型”小节对此进行了简要描述。 eloquent-relationships#many-to-many
基本上,您将为数据透视表创建一个模型,以便可以为其定义其他关系。
由于Laravel仍会为您处理关系,因此您仍然可以像现在一样从Blade和Controllers访问数据。但是,您可以使用->pivot
访问数据透视表,并且您已经告知laravel为数据透视表使用模型,您还可以访问该模型中所有关系定义的函数。
示例:
员工
class Employee extends Model
{
protected $fillable = ['name'];
public function emails(){
return $this->belongsToMany('App\Email')
->using('App\PivotModel');
}
}
电子邮件
class Email extends Model
{
protected $fillable = ['username'];
public function employees(){
return $this->belongsToMany('App\Employee')
->using('App\PivotModel');
}
}
PivotModel
class EmailEmployee extends Pivot
{
public function assignedBy(){
return $this->belongsTo('App\Employee','assigned_by');
}
}
请确保在数据透视表模型而非模型上扩展数据透视表
现在您可以这样做:
$user->emails()->first()->pivot->assignedBy
-> first()的原因是您有很多对很多,这意味着您将获得分配给用户的电子邮件的集合。您通常会遍历它们,但是对于本示例,只需选择第一个即可。
如果只需要列值而不是关系值,请添加->withPivot('assigned_by')
,这将允许您直接访问该值。
如果您要在进行分配时进行审核,那么如果您的数据透视表中包含时间戳,则还可能要添加->withTimestamps()
,以便您也可以访问它们。
答案 1 :(得分:0)
您可以使用自定义枢轴模型
EmailEmployee
class EmailEmployee extends Pivot
{
public function giver()
{
return $this->belongsTo('App\Employee');
}
}
员工
class Employee extends Model
{
public function emails(){
return $this->belongsToMany('App\Email')->using('App\EmailEmployee');
}
}
电子邮件
class Email extends Model
{
public function employees()
{
return $this->belongsToMany('App\Employee')->using('App\EmailEmployee');
}
}
因此,您可以通过$ email-> pivot-> giver访问giver
;
答案 2 :(得分:0)
数据透视模型的更改
数据透视模型
use \Illuminate\Database\Eloquent\Relations\Pivot;
class EmailEmployee extends Pivot{
public function assignedBy(){
return $this->belongsTo('App\Employee','assigned_by');
}
}