我正在创建一个用户具有不同角色的应用。其中一些角色包括:
我有以下表格设置:
user
role
role_user
role_user
是一个数据透视表,用于存储user_id
和role_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();
}
答案 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)
}
这一切都取决于您的应用需求。