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

如何从Laravel查询构建器访问语法类的wrapJsonSelector方法?

问题解决:Laravel调用isJsonSelector方法不存在的报错

报错原因

你调用的isJsonSelector方法在当前使用的Laravel版本的MySqlGrammar类中不存在——这类方法是Laravel 9及以上版本才新增的,旧版本并未提供。

解决方案

方案一:让Laravel自动处理(推荐)

Laravel查询构建器本身支持自动识别foo->bar这类JSON路径格式,并根据数据库类型(MySQL/PostgreSQL)自动转换为对应语法,完全不需要手动调用wrapJsonSelector。你的代码可以简化为:

$query->where(function (Builder $query) use ($searchColumn): Builder {
    // 直接使用$searchColumn即可,框架会自动处理JSON路径转换
    return $query->where($searchColumn, 'like', "%{$searchValue}%");
    // ... 其他查询逻辑
})

方案二:手动处理兼容(适配旧版本Laravel)

如果项目无法升级Laravel版本,可以自行判断JSON路径并手动转换:

$query->where(function (Builder $query) use ($searchColumn): Builder {
    $grammar = $query->getGrammar();
    // 自定义判断是否为JSON选择器的逻辑
    $isJsonSelector = str_contains($searchColumn, '->') || str_contains($searchColumn, '->>');
    
    if ($isJsonSelector) {
        // 拆分JSON列名和路径
        [$column, $path] = explode('->', $searchColumn, 2);
        $path = trim($path, '"');
        
        // 根据数据库类型生成对应格式
        if ($grammar instanceof MySqlGrammar) {
            $searchColumn = "{$column}->'$.{$path}'";
        } elseif ($grammar instanceof PostgresGrammar) {
            $searchColumn = "{$column}->>'{$path}'";
        }
    }
    
    // ... 后续查询逻辑
})

方案三:升级Laravel版本

如果项目允许,升级到Laravel 9或更高版本,此时MySqlGrammar和PostgresGrammar会自带isJsonSelector和wrapJsonSelector方法,你的原始代码即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:59:55