Laravel spatie扩展与lada-cache兼容冲突:查询执行实例类型错误
解决方案
方案1:排除spatie关联表不使用lada-cache(改造成本最低,推荐)
该方案适合不需要缓存权限类查询的场景,直接让lada-cache跳过spatie相关表的缓存逻辑,从根源避免类型校验报错:
- 若未发布过lada-cache配置,先执行命令导出配置:
php artisan vendor:publish --provider="Spiritix\LadaCache\LadaCacheServiceProvider" - 打开
config/lada-cache.php文件,找到exclude配置项,加入spatie/laravel-permission相关的系统表:'exclude' => [ 'permissions', 'roles', 'model_has_permissions', 'model_has_roles', 'role_has_permissions', // 其他spatie扩展涉及的业务表也可按需加入 ], - 执行
php artisan config:clear清空配置缓存后重新测试即可。
方案2:自定义spatie模型适配lada-cache
如果需要缓存spatie相关的查询数据,可改造spatie的默认模型,引入lada-cache的适配trait:
- 先导出spatie/laravel-permission的配置文件:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" - 新建自定义权限模型,例如
app/Models/Role.php、app/Models/Permission.php,继承spatie原生模型并引入lada-cache的trait:
Permission模型参照上述逻辑修改即可。<?php namespace App\Models; use Spatie\Permission\Models\Role as OriginalRole; use Spiritix\LadaCache\Database\LadaCacheTrait; class Role extends OriginalRole { use LadaCacheTrait; } - 打开
config/permission.php,将模型指向修改为你自定义的类:'models' => [ 'permission' => App\Models\Permission::class, 'role' => App\Models\Role::class, ], - 清空应用缓存后测试功能。
方案3:修改lada-cache类型校验逻辑(极端场景兼容用)
如果前两个方案不符合业务需求,可通过composer类覆盖的方式修改lada-cache的参数校验规则:
- 新建自定义覆盖类路径
app/Overrides/Spiritix/LadaCache/Reflector.php,复制vendor/spiritix/lada-cache/src/Spiritix/LadaCache/Reflector.php的全部内容到该文件。 - 修改
getTablesFromWhere方法的参数类型声明:// 原代码 public function getTablesFromWhere(\Spiritix\LadaCache\Database\QueryBuilder $builder, $where) // 修改为接收原生QueryBuilder即可 public function getTablesFromWhere(\Illuminate\Database\Query\Builder $builder, $where) - 打开项目根目录的
composer.json,在autoload节点下新增files配置,优先加载自定义覆盖类:"autoload": { "files": [ "app/Overrides/Spiritix/LadaCache/Reflector.php" ], // 保留其余原有autoload配置不变 } - 执行
composer dump-autoload重新生成自动加载规则后测试。
内容的提问来源于stack exchange,提问作者Deepraj Parmar
相关产品推荐
相关产品推荐

