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

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:
    <?php
    namespace App\Models;
    
    use Spatie\Permission\Models\Role as OriginalRole;
    use Spiritix\LadaCache\Database\LadaCacheTrait;
    
    class Role extends OriginalRole
    {
        use LadaCacheTrait;
    }
    
    Permission模型参照上述逻辑修改即可。
  • 打开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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:57:05