具有复合外键的Laravel关系

问题描述 投票:0回答:1

这是我想要实现的目标,我们有员工,每个员工可以为一个部门分配一个职位,为一个部门分配一个指定,为多个部门分配多个附加费用 ,每个附加费用一个部门。我想将所有职责存储在staff_responsibilities表中

我有一个staff表,其以下各栏

  • id
  • 名称
  • 电子邮件

然后我有了staff_responsibilities表,其中包含以下列:

  • staff_id
  • designation_id
  • department_id
  • responsibility_type_id

职责类型可以是PositionAdditional Charge,一个职员可以有多个具有Additional Charge职责的职务。

然后我有一个responsibility_types表,其中包含以下列:

  • id
  • 名称

// I have no way to tell this relationship to look for a responsibility type 2 (2 is the id of the responsibility called `Designation`) 

public function designation()
    {
        return $this->hasOne(StaffResponsibility::class);
    }

// I have no way to tell this relationship to look for a responsibility type 2 
    public function position()
    {
        return $this->hasOne(StaffResponsibility::class);
    }

// Gives error: Syntax error or access violation: 1066 Not unique table/alias: 'staff_responsibilities' 
    public function additionalCharges()
    {
        return $this->belongsToMany(StaffResponsibility::class, 'staff_responsibilities','designation_id');
    }

任何帮助都将不胜感激。

工作人员职责表

staff_responsibilities

responsibility_types表

responsibility_types table

名称表

designations table

laravel eloquent many-to-many relationship
1个回答
1
投票

这是我想要实现的,我们有员工,每个员工可以为一个部门担任一个职位,为一个部门指定一个职位,为多个部门承担多个附加费用,每个部门收取一个费用。

在我看来,为位置指定附加费用创建模型将是有益的。感觉您可能需要normalize your database或将staff_responsibilities更改为pivot table

但是在不知道您的申请的情况下很难说。

要回答您的问题,您可以在StaffResponsibility中添加一些范围。

class StaffResponsibility extends Model{

    public function scopeDesignation($query)
    {
        return $query->where('responsibility_type_id','=',2);
    }

}

并使用它

public function designation()
{
    return $this->hasOne(StaffResponsibility::class)->designation();
}

根据您所写的内容,最后一个是hasMany关系,而不是manyToMany:

public function additionalCharges()
{
    return $this->belongsTo(StaffResponsibility::class, 'staff_responsibilities','designation_id')->additionalCharges();
}
© www.soinside.com 2019 - 2024. All rights reserved.