首页 文章

从Laravel中的模型或控制器查询表

提问于
浏览
-1

我有表 role_user ,它有两列 user_idrole_id . user_idusers 表中的用户ID, role_idroles 表中的id .

我想查询 role_user 并在每个用户旁边显示角色名称 . 例

users

user_id username ...
   1      Test user

roles

role_id  role_name
   1       Admin

role_user

user_id   role_id
  1          1

我想在页面上显示

Test user - Admin

我在我的 Users 模型中添加了这个

public function role()
{
    return $this->hasOne('App\Role', 'user_id', 'role_id');
}

这在控制器中

public function users()
{
    $userRole = User::find(1)->role;

    return View::make('users', [
        'userRole' => $userRole
    ]);
}

目前我已经明白为什么:

SQLSTATE [42S22]:找不到列:1054'where子句'中的未知列'roles.user_id'(SQL:select * from roles,其中roles.user_id为null,roles.user_id不为null限制1)

问题是如何从控制器或模型中查询 role_user 表,同时显示用户以显示角色名称 .

2 回答

  • -1

    您已经定义了表,因此一个用户可以拥有多个角色(使用一个您的 role_user 表的数据透视表 .

    如果用户只能拥有一个角色,则可以删除role_user表并将“ role_id ”列添加到users表中 .

    使用当前实现将用户模型中的 role 关系更改为以下 .

    public function roles()
    {
        return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');
    }
    

    在你的控制器中

    public function users()
    {
        $users= User::with('roles')->get();
    
        return View::make('users', [
            'users' => $users
        ]);
    }
    

    要简单地显示角色的名称,请使用 implode 返回集合的方法

    @foreach ($users as $user)
        {{ $user->roles->implode('name', ',') }}
    @endforeach
    
  • 1

    您正在使用数据透视表来维护关系,因此您需要 belongsToMany 关系并为其定义自定义访问器,如下所示:

    //User model file
    public function roles()
    {
        return $this->belongsToMany(App\Role::class);
    }
    
    public function getRoleAttribute()
    {
        return $this->roles()->first();
    }
    

相关问题