如何在Laravel中的数据透视表中添加其他列关系

时间:2019-07-02 07:38:10

标签: laravel eloquent many-to-many relationship

版本: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);

但不起作用

3 个答案:

答案 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');
        }
    }