如何使用 Postgres jsonb '? Laravel 中具有索引支持的运算符?

Posted

技术标签:

【中文标题】如何使用 Postgres jsonb \'? Laravel 中具有索引支持的运算符?【英文标题】:How to use Postgres jsonb '?' operator in Laravel with index support?如何使用 Postgres jsonb '? Laravel 中具有索引支持的运算符? 【发布时间】:2020-06-04 04:43:21 【问题描述】:

我正在尝试使用 jsonb 存在运算符 '?'在 Laravel 的查询构建器中,并让它使用索引,但我遇到了一些问题。

示例查询

DB::table('table_name')->whereRaw("jsonb_column ? 'key'")->get();

样本索引

CREATE INDEX ON table_name USING GIN(jsonb_column jsonb_ops)

主要问题似乎是“?”保留用于参数替换,因此此查询返回语法错误。我找到了几种解决方法,但每种方法都不完整。

    使用 '??' (一种逃避的方法?) ->whereRaw("jsonb_column ?? 'key'")

    不适用于查询构建器。返回SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: jsonb ?? unknown 适用于原始查询,例如DB::select("SELECT * FROM table_name WHERE jsonb_column ?? 'key'"),但我需要它与查询生成器一起使用。

    使用命名函数/为运算符创建别名

    '?'转换为函数 - jsonb_exists(jsonb, text) ->whereRaw("jsonb_exists(jsonb_column, 'key')") CREATE OPERATOR @-> ( PROCEDURE = jsonb_exists, LEFTARG = jsonb, RIGHTARG = text ); ->whereRaw("jsonb_column @-> 'key'") 这些解决方案都“有效”...但它们不使用索引

现在我正在研究CREATE OPERATOR CLASS,作为一种让我的自定义运算符使用杜松子酒索引的方法,但这有点超出我的想象。如果有人能给我一些关于如何完成此任务的提示,或者更好的是一些更简单的解决方案,那将是一个巨大的帮助。

编辑

使用 php 7.3

【问题讨论】:

“不适用于 querybuilder”:查询构建器是什么样的?你的 PHP 版本是多少? 抱歉,我认为这是不言自明的。只是替换'?和 '??'。所以 ->whereRaw("jsonb_column ?? 'key'"),我使用的是 PHP 7.3 版 我问是因为我很惊讶?? 可以为您处理原始查询。据我所知,?? 应该只适用于 PHP 7.4:wiki.php.net/rfc/pdo_escape_placeholders 你能升级吗?在 PHP 7.4 上,我已经成功地将 ?? 与查询生成器一起使用。 神圣的 $#!# 它有效。升级到 PHP 7.4,然后使用带有“??”的 whereRaw作品!!我爱你,点赞按钮在哪里? 您想发表回复,以便我可以为您提供解决方案吗?否则我想我会回复自己以关闭问题。 【参考方案1】:

PHP 7.4 允许您使用 ?? 转义占位符:https://wiki.php.net/rfc/pdo_escape_placeholders

DB::table('table_name')->whereRaw('jsonb_column ?? ?', ['key'])->get();

【讨论】:

以上是关于如何使用 Postgres jsonb '? Laravel 中具有索引支持的运算符?的主要内容,如果未能解决你的问题,请参考以下文章

postgres 将 jsonb[] 更改为 jsonb

如何使用 Slick 在 Postgres 中将 json 对象插入到 jsonb 类型的列中

如何在 JPA 中使用 Postgres JSONB 数据类型?

如何根据postgres的jsonb列的where条件(无本机查询)使用jpa在spring boot中选择数据?

如何使用 Postgres jsonb '? Laravel 中具有索引支持的运算符?

如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作