修改spatie/laravel-permission权限与角色表遇问题求助
解决Laravel权限查询自动带model_type字段的问题
你大概率用的是Spatie的laravel-permission包——毕竟Honeybadger的Laravel权限指南默认用这个。这个包默认是多态关联设计,支持给用户、角色甚至其他自定义模型分配权限,所以会自动在查询里加model_type的条件。你改成只绑定用户的单关联后,得从这几个地方改:
1. 自定义权限模型并修改关联逻辑
首先得把包的默认模型拉到自己的项目里改,不然每次更新包都会覆盖:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="models"
这会在app/Models下生成Permission.php和Role.php,打开Permission.php,把原本的多态关联改成和User的普通关联:
// 替换原来的morphTo关联 public function model() { return $this->belongsTo(User::class, 'model_id'); }
2. 重写User模型里的权限关联和查询方法
包的HasPermissions trait里的方法还是会默认加model_type条件,所以得在User模型里重写对应的方法:
use Spatie\Permission\Traits\HasPermissions; use App\Models\Permission; class User extends Authenticatable { use HasPermissions; // 重写permissions关联,去掉多态的model_type约束 public function permissions() { return $this->belongsToMany(Permission::class, 'model_has_permissions', 'model_id', 'permission_id'); } // 重写获取权限ID的方法,避免包自动加model_type条件 public function getPermissionIds() { return $this->permissions()->pluck('id')->toArray(); } }
3. 清理缓存,生效修改
改完模型和关联后,必须清缓存,不然Laravel会用旧的缓存逻辑:
php artisan cache:clear php artisan config:clear php artisan optimize:clear
4. 验证查询是否正常
可以跑个简单的调试命令确认SQL里没有model_type了:
// 在路由或者tinker里执行 dd(User::find(1)->permissions()->toSql());
注意:这个修改只适合你的应用只给用户分配权限的场景,如果之后要给角色或其他模型加权限,这套修改就会失效,得改回多态关联。
内容的提问来源于stack exchange,提问作者YRD Nik
相关产品推荐
相关产品推荐

