How to access grammar from query builder?

197 Views Asked by At

I'm trying to convert a json column name with path 'foo->bar' to be compatible with mysql/postgresql using Laravel's wrapJsonSelector() method.

How can I access this method from the query builder calling getGrammar throws error:

Method Illuminate\Database\Query\Grammars\MySqlGrammar::isJsonSelector does not exist.

Eg

$query->where(function (Builder $query) use ($searchColumn): Builder {
    if ($query->getGrammar()->isJsonSelector($searchColumn)) {
        $searchColumn = $query->getGrammar()->wrapJsonSelector($searchColumn);
    }
    // ...
})
3

There are 3 best solutions below

0
user3840170 On BEST ANSWER

isJsonSelector and wrapJsonSelector are protected methods, which means you cannot access them from outside the class. However, you don’t need to invoke either of them directly in the first place. You can just use the wrap method, which will invoke wrapJsonSelector in the case you want to cover here.

1
Jamie Burton On
DB::table('your_table')
->selectRaw('your_json_column->"$.foo->bar" as modified_column')
->get();

The selectRaw method allows you to write raw SQL expressions within your query.

0
cetver On

The wrapJsonSelector method is not accessible (protected), but it is called in the wrap method.

$expression = $query->getGrammar()->wrap("table.column->?"); // "table"."column"->>'?'
$query->whereRaw($expression, ['value']);