【问题标题】:Eloquent relationship between user roles用户角色之间的雄辩关系
【发布时间】:2015-09-02 10:39:19
【问题描述】:

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

  • 管理员
  • 主管
  • 承包商

我有以下表格设置:

  • user
  • role
  • role_user

role_user 是用于存储user_idrole_id 的数据透视表。

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

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

以上行基本上只是在role_user 数据透视表中创建了一个新行,并指向Contractorrole_id。这导致用户拥有 Contractor 权限。

此外,在我需要将用户分配给 主管 的情况下。但是,没有 Supervisor 模型。主管也存储在用户表中,并分配给他们一个主管角色。

我如何才能在 ContractorsSupervisors 之间建立关系?

理想情况下,我想使用这样的东西在数据透视表中创建承包商/主管关系:

$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();
}

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案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)
    }
    

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

    【讨论】:

    • 嗨,杰克,这确实是一个相当大的应用程序,所以我想从一开始就做好。作为更好的数据库设计,您有什么建议?
    • @V4n1ll4 抱歉,我再次查看了您的问题,您的数据库结构对我来说似乎很合理。 IMO 我仍然会遵循我上面定义的关系。您所拥有的是一种更具体的关系,可以过滤掉您不需要的不必要数据。我唯一要注意的是命名方法,因为最终您将定义更多类似上述的关系。我认为你在你的问题中所要求的对于 Eloquent 来说太过分了,你只需要定义额外的规则来帮助它:)
    • 你认为这适用于我的user 模型:$this->belongsToMany('App\Models\User\User')->join('role_user','user.id','=','role_user.user_id')->groupBy('user.id')->withTimestamps()
    • 这取决于您希望查询做什么。我以为你想要承包商和主管之间的关系?此查询将返回所有用户及其角色,这意味着您还将获取管理员?
    • 好的,如果我在上面添加一个 where 子句,例如:->where('role_user.role_id', 2) 它应该可以正常工作吗?主管的role_id 是 2。
    猜你喜欢
    • 2019-11-06
    • 2018-07-24
    • 2019-07-01
    • 1970-01-01
    • 2021-03-15
    • 2019-10-18
    • 1970-01-01
    相关资源
    最近更新 更多