You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安装spatie/laravel-permission后调用默认roles方法返回空如何解决

问题原因

Spatie 提供的默认 roles 关联会自动追加 guard_name 过滤条件,你自定义的关联没有该过滤逻辑,所以才会出现自定义方法能查到数据、默认方法返回空的情况。

解决步骤

  • 第一步:确认已经发布扩展包配置文件,执行命令:
    php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
  • 第二步:修改身份验证 guard 匹配规则,二选一即可:
    1. 在 config/auth.php 中修改 User 模型对应 guard 的驱动为 api,同时在 config/permission.php 的 defaults 配置项中将 guard 值改为 api
    2. 直接在你的 User 模型中重写 guardName 方法,指定使用 api guard 查询权限:
public function guardName()
{
    return 'api';
}
  • 第三步:清除 Spatie 权限缓存,避免缓存影响查询结果:
    php artisan permission:cache-reset

可选验证步骤

如果修改后仍不生效,可以通过打印SQL确认过滤条件:

\DB::enableQueryLog();
\App\Models\User::find(1)->roles()->get();
dd(\DB::getQueryLog());

查看生成的 SQL 中 guard_name 的过滤值是否为 api,如果还是 web 说明 guard 配置未生效,检查上述配置步骤是否正确执行。

修改完成后再调用默认的 roles 方法即可正常返回角色数据。

内容的提问来源于stack exchange,提问作者trannguyenhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:24:02