用于嵌套 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的主要内容,如果未能解决你的问题,请参考以下文章