将 Laravel 8 与 spatie 包一起使用尝试获取具有角色问题的用户列表调用未定义的方法 App\Models\User::hasAllRoles()

using Laravel 8 with spatie package try to get user list with role issue Call to undefined method App\Models\User::hasAllRoles()

我正在尝试获取用户列表及其在 laravel 8 中的角色,为了获得角色和许可,我使用 spatie 包 (https://spatie.be/docs/laravel-permission/v4/)

我正在尝试通过用户获取任何数据 return 错误

以下函数return错误

$all_users_with_all_their_roles = User::with('roles')->get(); 
$all_users_with_all_direct_permissions = User::with('permissions')->get(); 
$user->hasAllRoles(Role::all());

函数 (https://spatie.be/docs/laravel-permission/v3/basic-usage/basic-usage#eloquent)

ERROR : "Call to undefined method App\Models\User::getAllPermissions()",…}

我认为用户模型中缺少某些东西。

请帮忙解决这个问题

TIA

通知:

User::all()User::where(..)->get() 的结果是 laravel eloquent collection 的实例,而不是用户模型的实例。

解决方案:

在你的 collection 上使用 first() 或循环使用它。

$all_users_with_all_their_roles = User::with('roles')->get(); 
$all_users_with_all_direct_permissions = User::with('permissions')->get();

// Use for example first() to get the first user instance from collection 
$user->first()->hasAllRoles(Role::all());

// Or loop over it
foreach($all_users_with_all_direct_permissions as $user){
    $user->hasAllRoles(Role::all());
}

我想你忘了给用户添加特征 class:

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable {
    use HasRoles;

    // ...
}

如果你没有忘记 trait,那么使用下面的代码获取所有用户 rolespermissions.

$users = User::all();
$user_roles = [];
$user_permissions = [];
if($users) {
    foreach ($users AS $user) {
        $user_roles[$user->id] = $user->getRoleNames();
        $user_permissions[$user->id] = $user->getAllPermissions();
    }
}

FMI SEE:https://spatie.be/docs/laravel-permission/v3/basic-usage/basic-usage