【问题标题】:How to retrieve all related models in a many to many relationship Laravel?如何在多对多关系 Laravel 中检索所有相关模型?
【发布时间】:2019-03-03 12:41:43
【问题描述】:

我正在尝试通过中间表检索所有与另一个模型相关的模型,但不知道如何。 Laravel 文档说你可以这样做:

$roles = App\User::find(1)->roles()->orderBy('name')->get();

但是当我尝试将其应用于我的代码时

$roles = User::where('id', $user->id)->roles()->get();

它不起作用。我通过我的控制器接受用户模型,所以我可以访问它。

关系也是这样定义的:

User

public function roles()
{
    return $this->belongsToMany(Role::class);
}

Role

public function users()
{
    return $this->belongsToMany(User::class);
}

如何获取与特定用户关联的所有角色?

编辑/更新: 我知道我可以简单地使用 foreach 循环并获取与特定用户关联的所有角色,但我试图返回一个资源集合,所以我不能那样做

【问题讨论】:

  • 尝试将get() 更改为first()
  • 我收到一个错误,undefined method roles
  • @hoolakoola 我认为您的角色和用户之间的关系不正确。
  • 一般情况下Role与用户的关系为$this->hasMany(User::class);,也可以通过User::find($id)->roles;

标签: laravel many-to-many relationship


【解决方案1】:

您可以使用以下解决方案在 Laravel 中检索多对多关系中的所有相关模型:

$roles = User::where('id', $user->id)->get();
 foreach($roles as $rol){
  $rol->roles;
 }

【讨论】:

    【解决方案2】:

    用户

    use App\User;
    public function roles()
    {
       return $this->belongsToMany('App\Users', 'user_id');
    }
    

    角色

    use App\Roles;
    public function users()
    {
        return $this->belongsToMany('App\Roles');
    }
    

    控制器

    $roles = User::where('id', $user->id)->roles()->get();
    

    试试这个。我认为你们的关系不正确。

    你可以在这里阅读更多信息Many To Many

    【讨论】:

      【解决方案3】:

      您的第二种方法的问题是在“Eloquent Query Builder”实例上调用 roles() 函数。您需要确保在“用户模型”上调用 roles() 函数。

      这部分代码User::where('id', $user->id)返回“用户模型”。

      要从“查询生成器”实例中获取“用户模型”,您需要调用 first() 函数。

      可能的解决方案。

      $roles = User::where('id', $user->id)->first()->roles;
      

      【讨论】:

      • 这个答案有最需要的细节。无论如何,User::where('id', $user->id)->first() 可以简化为 User::find($id)
      【解决方案4】:

      试试这个, 我假设 $user_id 是从 URL 传递到控制器的参数,

      $roles=User::findOrFail($user_id)->roles;

      但在运行上述代码之前,我假设您已经为与列 user_id 和 role_id 的多对多关系创建了数据透视表。并将数据透视表命名为 role_user。

      希望这可行

      【讨论】:

        【解决方案5】:

        您收到错误的原因是因为在调用方法first()(或find()findOrFail())之前,实例是QueryBuilder。而roles() 方法只存在于User::class 实例上。

        如果您尝试获取具有属性rolesuser,其中包含他所有角色的集合(数组),请执行以下操作:

        $user = User::where('id', $user->id)->with('roles')->first();
        

        如果您只需要角色数组,您有两种选择; 要么获取用户,然后获取他的角色:

        $user = App\User::find($userId);
        $roles = $user->roles()->orderBy('name')->get();
        //the same as
        $roles = App\User::find($userId)->roles()->orderBy('name')->get();
        

        或获取角色(只有一个查询)

        $roles = Role::whereHas('users', function($users) use($userId) {
            $users->where('id','=',$userId);
        })->get();
        

        希望这能让您有足够的洞察力来构建您需要的确切代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-25
          • 2017-05-23
          • 2020-11-14
          • 2020-10-10
          • 1970-01-01
          • 2017-07-10
          • 1970-01-01
          • 2016-12-10
          相关资源
          最近更新 更多