用于嵌套 jsonb 的雄辩的 Where 子句。 PostgreSQL

Posted

技术标签:

【中文标题】用于嵌套 jsonb 的雄辩的 Where 子句。 PostgreSQL【英文标题】:Eloquent Where clause for nested jsonb. postgresql 【发布时间】:2020-09-29 02:49:28 【问题描述】:

我的表中有一个列如下:


  1:type: 0,
  2:type: 1...

我尝试过使用 whereJsonContains('table.column->type', 0) 但它不起作用, whereRaw("table->column @> '\"type\": 0'::jsonb"); 也不起作用,我猜是因为嵌套的 json 结构。我怎样才能做到这一点?

【问题讨论】:

您是否尝试过:->whereJsonContains('your.column', ['type' => '0']) 我试过了,但也没用 【参考方案1】:

从根本上讲,您的 JSON 不是一个数组,而是一个对象(请注意从 1 开始的索引和包含数据的括号)。您不能对对象执行whereJsonContains。您应该将 JSON 根转换为数组,或者进行全面查找:

案例一:

[
  type: 0,
  type: 1...
]

我建议这个代码:

DB::table('table')->whereJsonContains('column->type', 0)->get();

案例 2

DB::table('table')
    ->where('column->1->type', 0)
    ->orWhere('column->2->type', 1)
    ->get();

如需进一步参考,请参阅 Laravel 文档:https://laravel.com/docs/7.x/queries#json-where-clauses

【讨论】:

【参考方案2】:

在尝试了多个建议后,我最终使用了以下代码:

$model->whereRaw("(
                SELECT
                COUNT(elements.*) > 0
                FROM
                    jsonb_each(table.colum) elements
                WHERE
                elements.value->>'type' = ?
            )", [$validated_request['type']]);

感谢您的帮助。

【讨论】:

【参考方案3】:

我在表格列domains 中有["value": "example.co"]["value": "example.co", "value": "example.uk", "value": "example.pk", ... ] 之类的数据,最重要的是,提及方法无效。我最终使用了该代码。

DB::table('table')->where("domains", '@>', '["value":"example.uk"]')->get();

或者你可以使用它

$query = 'example.uk';
DB::table('table')->where("domains", '@>', '[' . json_encode(['value' => $query]) . ']')->get();

【讨论】:

以上是关于用于嵌套 jsonb 的雄辩的 Where 子句。 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

查询jsonb PSQL中数组元素的where子句

在 WHERE IN 子句中使用 JSONB 数组中的值

laravel 雄辩的 where 子句与枢轴

在laravel中雄辩的where子句中连接两列

如何在 laravel 雄辩的关系中使用 where 子句

Laravel 雄辩的 SQL 查询与 OR 和 AND 与 where 子句