【问题标题】:How to add additional column relationship in pivot table in Laravel如何在 Laravel 的数据透视表中添加额外的列关系
【发布时间】:2019-11-12 19:28:23
【问题描述】:

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

但不工作

【问题讨论】:

    标签: laravel eloquent many-to-many relationship


    【解决方案1】:

    自定义中间表模型

    要解决您的问题,您应该在belongsToMany 方法上使用->using() 方法。

    此链接中的“定义自定义中间表模型”小节简要描述了这一点。 eloquent-relationships#many-to-many

    您基本上为数据透视表创建了一个模型,以便您可以定义与它的其他关系。

    你仍然可以像现在一样从 Blade 和 Controllers 访问数据,因为 Laravel 仍然会为你处理这种关系。但是,您可以使用 ->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');
            }
        }
    

    数据透视模型

    class EmailEmployee extends Pivot
    {
        public function assignedBy(){
                return $this->belongsTo('App\Employee','assigned_by');
            }
    }
    

    确保在枢轴模型而不是模型上扩展 Pivot

    现在你可以这样做了:

    $user->emails()->first()->pivot->assignedBy
    

    ->first() 的原因是您有一个多对多,这意味着您将获得分配给用户的电子邮件集合。您通常会遍历它们,但在本例中,只需选择第一个即可。

    如果您只需要列值而不是关系值,请添加->withPivot('assigned_by'),这样您就可以直接访问该值。

    如果您想在分配时进行审核,那么您可能还需要添加 ->withTimestamps()(如果您的数据透视表包含时间戳),以便您也可以访问这些时间戳。

    【讨论】:

    • 奇怪,我的应用程序正在处理这个问题。你得到什么错误,或者什么不工作?
    • 您的代码几乎正确,但我在 assigned_by 上引用了 Employee 模型,而我没有 employee_id,laravel 采用默认值。看到我已经回答了......谢谢
    • 那是正确的..因为如果没有指定,我的列名与 laravel 默认列名为 employee_id 不同....
    【解决方案2】:

    Pivot 模型的变化

    枢轴模型

        use \Illuminate\Database\Eloquent\Relations\Pivot;
        class EmailEmployee extends Pivot{
            public function assignedBy(){
                return $this->belongsTo('App\Employee','assigned_by');
            }
        }
    

    【讨论】:

      【解决方案3】:

      您可以使用自定义枢轴模型

      电子邮件员工

      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

      【讨论】:

      • 来自 laravel 5.8 laravel.com/docs/5.8/…。你用的是哪个 laravel 版本?
      • bangnokia,您正在尝试获取示例中尚未访问的数据透视表的值。枢轴将在与电子邮件链接的用户上,而不仅仅是电子邮件。所以 $email->employees->first()->pivot->giver
      • 我使用的是 laravel 5.4
      猜你喜欢
      • 1970-01-01
      • 2018-06-27
      • 2021-07-12
      • 2020-03-23
      • 2022-01-16
      • 2014-12-21
      • 2017-01-12
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多