问题描述
我试图在Laravel的查询生成器中使用jsonb存在运算符'?',并使其使用索引,但是我遇到了一些问题。
I'm trying to use the jsonb exists operator '?' in Laravel's query builder, and have it use an index, but I've run into some issues.
示例查询
DB :: table('table_name')-> whereRaw( jsonb_column?'key')-> get();
样本索引
创建在table_name上使用GIN(jsonb_column jsonb_ops)索引#code>
CREATE INDEX ON table_name USING GIN(jsonb_column jsonb_ops)
主要问题似乎是'?'保留用于参数替换,因此此查询返回语法错误。我发现了几种解决方法,但是每种方法都不完整。
The main issue seems to be that '?' is reserved for parameter replacement, so this query returns a syntax error. I've found a couple ways around this, but each are incomplete solutions.
-
use'??'(一种逃脱?)
-> whereRaw( jsonb_column ??'key')
- 不适用于querybuilder。返回
SQLSTATE [42883]:未定义的函数:7错误:运算符不存在:jsonb ??未知
- 适用于原始查询,例如
DB :: select( SELECT * FROM table_name WHERE jsonb_column ??'key')
,但我需要它与查询生成器一起使用。
doesn't work with querybuilder. returns
SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: jsonb ?? unknown
works with raw queries, e.g.
DB::select("SELECT * FROM table_name WHERE jsonb_column ?? 'key'")
, but I need it to work with the query builder.
使用命名函数/为运算符创建别名
- '?'转换为函数-jsonb_exists(jsonb,text)
-
-> ; whereRaw( jsonb_exists(jsonb_column,'key'))
- '?' translates to the function - jsonb_exists(jsonb, text)
->whereRaw("jsonb_exists(jsonb_column, 'key')")
-
-> whereRaw( jsonb_column @->'key')
->whereRaw("jsonb_column @-> 'key'")
现在我正在研究
CREATE OPERATOR CLASS
,作为让我的自定义运算符使用gin索引的一种方法,但这有点麻烦。如果有人可以给我一些完成此操作的技巧,或者甚至更好的一些简单的解决方案,那将是巨大的帮助。Right now I'm researching
CREATE OPERATOR CLASS
, as a way to get my custom operator to use gin indexing, but it's a bit over my head. If anybody can give me some tips on how to accomplish this or, even better, some simpler solution, it'd be a huge help.- 使用php 7.3
推荐答案
PHP 7.4允许您使用
??
转义占位符:PHP 7.4 allows you to escape the placeholder with
??
: https://wiki.php.net/rfc/pdo_escape_placeholdersDB::table('table_name')->whereRaw('jsonb_column ?? ?', ['key'])->get();
这篇关于如何使用Postgres jsonb'?'支持在Laravel中使用索引支持?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!
-