调用Laravel中未定义的方法App \ User :: role()

时间:2019-09-12 11:02:11

标签: laravel roles

我想创建一个具有特定角色(或多个角色,如果指定了多个角色)的用户列表

在我的UserController中

use DB;
use Auth;
use Storage;

use App\Role;
use App\HasRoles;
use App\User;
use App\Profile;

$users = User::with('roles')->where('name', 'admin')->get();
return view('dashboard.users.index', compact('users')); 

但是我遇到了这个错误

enter image description here

如果我dd($users);

我看到角色在那里

enter image description here

如何解决此问题?谢谢!

编辑:用户模型

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable, HasRoles;

    protected $fillable = [
        'name', 'email', 'phone_number', 'avatar', 'password', 'verification_code'
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
        'phone_verified_at' => 'datetime',
    ];

    public function profile()
    {
        return $this->hasOne('App\Profile', 'user_id','id');
    }

    public function mailingAdd()
    {
        return $this->hasOne('App\MailingAddress', 'user_id','id');
    }

user / index.php

@foreach($users->role as $item)
    <tr>
        <td>{{ $loop->iteration }}</td>
        <td><a href="{{ url('/dashboard/users', $item->id) }}">{{ $item->name }}</a></td>
        <td>{{ $item->email }}</td>
        <td>{{ $item->role()->name }}</td>
        <td>{{ $item->phone_number==null ? 'None' : $item->phone_number  }}</td>
        <td>
            @if($item->phone_verfied_at==null)
                <span class="badge badge-danger">not yet verified</span>
            @else
                <span class="badge badge-success">verified</span>
            @endif
        </td>
    </tr>
@endforeach     

@foreach($users->role as $item)更改为@foreach($user->roles as $item)会给我“此集合实例上不存在属性[角色]”

用户表迁移

enter image description here

角色和权限表迁移

enter image description here

答案

根据西蒙·莫里斯的回答

@foreach($users as $user)
    {{ $user->name }}
    @foreach ($user->roles as $role)
        {{ $role->name }}
    @endforeach
@endforeach

我从这里的一些建议中删除了添加的关系。并实现我上面粘贴的答案。

如果用户指定了多个角色,该代码将显示具有特定用户角色的用户列表。

感谢大家的回答!欢呼!

2 个答案:

答案 0 :(得分:4)

您正在呼叫$user->role()而不是$user->roles()

要将它们作为要遍历的数组进行操作

foreach($user->roles as $role){
  // do something with role here
}

答案 1 :(得分:0)

从外观上看,我认为您错误地引用了dashboard.users.index视图内的表示:如果您具有:

$user->role() 

将其更改为:

$user->roles() 

或者只是在模型中更改您的关系名称。如果关系类型为hasOne,则将其重命名为user(),因为它将始终只扮演一个角色,而无需复数形式。