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

Posted

技术标签:

【中文标题】使用带有 spatie 包的 Laravel 8 尝试获取具有角色问题的用户列表调用未定义的方法 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()使用带有 spatie 包的 Laravel 8 尝试获取具有角色问题的用户列表调用未定义的方法 App\Models\User::hasAllRoles() 【发布时间】:2021-07-25 01:32:39 【问题描述】:

我尝试获取用户列表及其在 laravel 8 中的角色,对于角色和权限,我使用 spatie 包 (https://spatie.be/docs/laravel-permission/v4/)

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

以下函数返回错误

$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)

错误:“调用未定义的方法 App\Models\User::getAllPermissions()”,...

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

请帮忙解决这个问题

TIA

【问题讨论】:

其他与角色相关的方法是否有效?你添加了特质吗?您在该代码中在哪里调用 ->getAllPermissions() 【参考方案1】:

注意:

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

解决办法:

在你的集合上使用 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());

【讨论】:

【参考方案2】:

我认为您忘记将特征添加到 User 类:

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 查看:https://spatie.be/docs/laravel-permission/v3/basic-usage/basic-usage

【讨论】:

以上是关于使用带有 spatie 包的 Laravel 8 尝试获取具有角色问题的用户列表调用未定义的方法 App\Models\User::hasAllRoles()的主要内容,如果未能解决你的问题,请参考以下文章

php 具有Spatie Peermission包的Laravel Nova用户模型

如何使用 laravel 8 +jetstream + spatie 为注册用户分配角色

laravel-用户活动以及模型变动日志-spatie/laravel-activitylog

Laravel包的作曲家需要

Laravel 5.7 + Spatie 权限 + JWT 身份验证

如何使用 spatie/laravel-query-builder 过滤/搜索具有关系的数据? (拉拉维尔)