如何使用Postgres jsonb'?'支持在Laravel中使用索引支持? [英] How to use Postgres jsonb '?' operator in Laravel with index support?

查看:130
本文介绍了如何使用Postgres jsonb'?'支持在Laravel中使用索引支持?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在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.


  1. 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允许您使用 ?? 转义占位符: https://wiki.php.net/rfc/pdo_escape_placeholders

      PHP 7.4 allows you to escape the placeholder with ??: https://wiki.php.net/rfc/pdo_escape_placeholders

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

      这篇关于如何使用Postgres jsonb'?'支持在Laravel中使用索引支持?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆