Laravel eloquent在多选中检索用户角色

时间:2015-01-30 23:54:02

标签: php laravel laravel-4 eloquent

您好我正在使用Laravel,并且我使用了几个用于身份验证的用户身份和Zizaco ConfideZizaco Entrust的角色。我已经完成了设置过程,我有角色和权限。这创建了以下表格:

用户,角色,assigned_roles,权限,permission_role

表格结构如下:两位用户:

users table
id | username    | email 
1  | adminuser   | admin@test.com
2  | subscriber  | subscriber@test.com

roles
id | name 
1  | admin
2  | subscriber

assigned_roles
id | user_id | role_id
1  | 1       | 1
2  | 1       | 2
3  | 2       | 2

permissions
id | name              | display_name
1  | can_view_admin    | Can View Admin Display
2  | can_view_articles | Can View Articles

permission_role
id | permission_id | role_id 
1  | 1             | 1
2  | 1             | 2
3  | 2             | 2

我有一个更新用户表的编辑和更新功能。但是,我也希望在此视图中以及在用户控制器中更新用户权限。但是我不确定如何获取用户角色,因为他们可以拥有多个角色并将其注入多选中。

这是我到目前为止所做的:

用户控制器:

 public function edit($id)
    {
           $user = Auth::user();       
            if ($user->hasRole('Admin'))
                {
                    $user = User::find($id);
                    return View::make('users.edit')->with('user', $user);
                }
                else {
                    return \Redirect::route('article');
                }
    }



public function update($id)
    {

        $rules     = array(
            'username' => 'required',
            'email'    => 'required'
        );

        $validator = Validator::make(Input::all(), $rules);

        // process the login
        if ($validator->fails()) {
            return Redirect::back('/admin/user/' . $id . '/edit')->withErrors($validator)->withInput();

        } else {
            // store
            $user               = User::find($id);
            $user->firstname    = Input::get('firstname');
            $user->lastname     = Input::get('lastname');
            $user->username     = Input::get('username');
            $user->email        = Input::get('email');
            $user->save();

            // redirect
            Session::flash('message', 'Successfully updated!');
            return Redirect::to('/admin');
        }
    }

我的编辑表格如下:

{{ HTML::ul($errors->all()) }}
{{ Form::open(array('url' => URL::to('admin/user/'.$user->id.'/update'), 'method' => 'PATCH ')) }}
{{ Form::model($user) }}

        {{ Form::text('firstname', null, array('class' => 'form-control')) }}

        {{ Form::text('lastname', null, array('class' => 'form-control')) }}

        {{ Form::text('username', null, array('class' => 'form-control')) }}

        {{ Form::text('email', null, array('class' => 'form-control')) }}


    {{ Form::submit('Update User', array('class' => 'btn btn-green')) }}
{{ Form::close() }}

我知道我可以这样获取所有角色:

$roles =  DB::table('roles')->orderBy('name', 'asc')->lists('name', 'id'); 

然后插入多选中:

{{ Form::select('role', $roles , Input::old('role'), array('class' => 'select')) }}

我知道你可以这样获得用户角色:

$roles = User::find(1)->roles();

所以我尝试在编辑功能中更改此行

$user = User::find($id);

为:

$user = User::find($id)->roles()->orderBy('name', 'asc')->lists('name', 'id');

但这引发了这个错误:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in field
 list is ambiguous (SQL: select `name`, `id` from `roles` inner join 
 `assigned_roles` on `roles`.`id` = `assigned_roles`.`role_id` where 
 `assigned_roles`.`user_id` = 1 order by `name` asc)

有人知道我如何使用委托内的功能获取用户角色(因为他们可以拥有多个角色)?或者可能使用eloquent,因为数据存储在几个表格中,例如在编辑屏幕中,我希望通过user抓取roles user_id这些数据存储在assigned_roles中1}}表。然后我需要获取存储在角色表中的角色名称,assigned_roles表包含role_id。然后我需要把它放到一个多选的任何关于如何做到这一点的想法?我不是很有说服力,所以任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

对于select,您实际上需要将所有角色都作为数组:

$roles = Role::orderBy('name', 'asc')->lists('name', 'id');
$user = User::find($id);
return View::make('users.edit')->with('user', $user)->with('roles', $roles);

然后在你看来:

{{ Form::select('roles', $roles, $user->roles->lists('id'), array('class' => 'select', 'multiple' => true)) }} 

之后,您可以在sync()函数中使用update()来保存角色:

// ...
$user->save();

$user->roles()->sync(Input::get('roles', []));
// ...