【问题标题】:Laravel 4 tables relationship EloquentLaravel 4 表关系 Eloquent
【发布时间】:2015-01-01 19:34:32
【问题描述】:

我有四张桌子:

用户:id、用户名
角色:id、姓名
域 ID、标题
DomainsAssignedRolesUsers id、role_id、user_id、domain_id

我想获取域的所有用户角色。

我愿意:

User::find(1)->domains->first()->roles

但我获得了所有域角色,而不仅仅是我的用户。帮助我仅获取所选域的用户角色/

我的关系:

// User model:

public function rolesDomain() {
    return $this->belongsToMany('Role', 'domainsAssignedRolesUsers', 'user_id', 'role_id');
}

public function domains() {
    return $this->belongsToMany('Domain', 'domainsAssignedRolesUsers');
}

// Role model:

public function domains() {
    return $this->belongsToMany('Domain', 'domainsAssignedRolesUsers');
}

// Domain model:

public function roles() {
    return $this->belongsToMany('Role', 'domainsAssignedRolesUsers', 'domain_id', 'role_id');
}

public function users() {
        return $this->belongsToMany('User', 'domainsAssignedRolesUsers', 'domain_id', 'user_id');
    }

【问题讨论】:

    标签: php mysql laravel laravel-4 eloquent


    【解决方案1】:

    查看 Eloquent Triple Pivot(也在 Packagist 上),听起来它完全符合您的要求。

    您将模型设置为UserDomainRoleUser 有许多Domains,每个都可以有一个Role)。然后查看 Github 页面上的文档(特别是第 6 步),您将在 Domain 模型上定义它:

    class Domain extends Eloquent {
        ...
        public function getRolesAttribute() {
            return $this->getThirdAttribute();
        }
    }
    

    那么你可以简单地调用

    $user = User::find(1);
    
    $domain = $user->domains->first();
    // or
    $domain = $user->domains->find(73);
    
    $roles = $domain->roles;
    
    // Or the above can be condensed into just...
    $roles = User::findOrFail( 1 )
                 ->domains()
                 ->findOrFail( 73 )
                 ->roles;
    

    【讨论】:

    • 稍微修正一下:->domains()->findOrFail->domains()->first(..) - 使用(),否则您将处理该集合。也就是说first 可以工作,但findOrFail 会抛出错误,因为它是 Eloquent Builder 的方法。
    • @JarekTkaczyk 很好 :-) 我会去修改我复制/粘贴的其他答案:P
    • 我都做了,但现在我有一个例外:调用未定义的方法 Illuminate\Database\Query\Builder::getThirdKey() 这里:TriplePivotTrait.php on line 62
    • @LastRide 检查 GitHub 文档 - 我认为您在一个或多个模型中错过了第 4 步
    • 没有这个包我怎么做这个?
    【解决方案2】:

    您想从特定域中获取与用户相关的所有角色?

    所以这应该可以解决问题:

    User::find(1)->rolesDomain()->where('domain_id', $specificID)->get()
    

    但是,如果您只想从第一个域中获取用户的角色。

    User::find(1)->domains()->first()->roles()->get();
    

    如果您只想检索用户的角色。

    User::find(1)->rolesDomain()->get() 
    

    如果您只想从每个域中检索与用户相关的所有角色。

    User::find(1)->domains()->with('roles')->get()
    

    即使 Eloquent 文档有几个例子,这个 orm 真的很直观。

    【讨论】:

    • 这里我获取所有域。不只是为了我的用户
    • 它不起作用 :( 在这里我按域获取所有角色。不仅仅是我的用户。
    • 也许您应该将用户模型中的域方法更改为 return $this->belongsToMany('Domain', 'domain_assigned_roles', 'user_id', 'domain_id');我可以保证这个案例对我有用,我有一篇博文,其中有很多类别,有很多标签,如果我这样做 Post::find(1)->categories()->first()->tags()->get () 我得到了与第一个帖子相关的第一个类别的所有标签
    • 好的,我想我知道我错了。也许这适用于您的情况: User::find(1)->rolesDomain()->get() 我没有意识到您只想获取用户的角色。如果是这样,您只需要使用用户与其角色之间的直接关系
    • 我想获得我的用户角色的确切域。并非用户的所有角色:)
    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 2013-12-14
    • 2015-03-02
    • 2021-05-09
    • 2021-05-06
    • 2015-04-19
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多