用户角色之间雄辩的关系

时间:2015-09-02 10:39:20

标签: php laravel laravel-5

我正在创建一个用户具有不同角色的应用。其中一些角色包括:

  • 管理员
  • 承包商

我有以下表格设置:

  • user
  • role
  • role_user

role_user是一个数据透视表,用于存储user_idrole_id

现在,当创建 Contractor 时,我会触发一个事件,将用户分配到数据库中的 Contractor 角色:

$user->roles()->save($role, ['cust_id' => $event->user->cust_id]);

上述代码基本上只是在role_user数据透视表中创建一个新行,并指向 Contractor role_id。这导致用户具有 Contractor 特权。

此外,在事件中我需要将用户分配给主管。但是,没有 Supervisor 模型。主管也存储在用户表中,并分配了主管的角色。

如何在承包商主管之间建立关系?

理想情况下,我想使用类似的东西在数据透视表中创建Contractor / Supervisor关系:

$user->supervisors()->save($supervisors, ['cust_id' => $event->user->cust_id]);

但我不确定如何设置我的模型......?

/**
 * The supervisors that belong to the user.
 *
 * @return Object
 */
public function supervisors()
{
    return $this->belongsToMany('SimplyTimesheets\Models\User\User')->withTimestamps();
}

1 个答案:

答案 0 :(得分:1)

您的要求是可能的,但您的关系模型将如下所示:

public function cands()
{
    return $this->belongsToMany('Some\Model')->where('something', $something)->where('something', $something); 
}

您必须使用where子句对承包商和主管之间的关系进行硬编码,因为它们之间没有直接关系。

/ *编辑* /

根据您的评论,您必须使用eager loading您的关系来处理该查询:

User::has('supervisors')->join(...)->where(...)->get();

上面的查询将返回符合角色条件的所有用户。如果您只是在一个结果之后,则可以与where子句创建hasOne关系。

public function relationship()
{
    return $this->hasOne('Your\User_Role\Model', 'foreign_key', 'other_key')->where('role_id', supervisor)->where('role_id', contractor)
}

这一切都取决于您的应用需求。