Eloquent 嵌套 jsonb 的 Where 子句。 postgresql
Eloquent Where clause for nested jsonb. postgresql
我的 table 中有一列如下:
{
1:{type: 0},
2:{type: 1}...
}
我试过使用 whereJsonContains('table.column->type', 0)
但它不起作用,
whereRaw("table->column @> '{\"type\": 0}'::jsonb");
也不起作用,我猜是因为嵌套的 json 结构。我怎样才能使这项工作?
在根目录下,您的 JSON 不是一个数组,而是一个对象(请注意从 1 开始的索引和包含数据的括号)。您不能对对象执行 whereJsonContains
。您应该将 JSON 根目录转换为数组,或者进行全面查找:
案例一:
[
{type: 0},
{type: 1}...
]
我建议这个代码:
DB::table('table')->whereJsonContains('column->type', 0)->get();
案例二
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
在尝试了多种建议后,我最终使用了这个代码:
$model->whereRaw("(
SELECT
COUNT(elements.*) > 0
FROM
jsonb_each(table.colum) elements
WHERE
elements.value->>'type' = ?
)", [$validated_request['type']]);
感谢您的帮助。
我在 table 列 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();
我的 table 中有一列如下:
{
1:{type: 0},
2:{type: 1}...
}
我试过使用 whereJsonContains('table.column->type', 0)
但它不起作用,
whereRaw("table->column @> '{\"type\": 0}'::jsonb");
也不起作用,我猜是因为嵌套的 json 结构。我怎样才能使这项工作?
在根目录下,您的 JSON 不是一个数组,而是一个对象(请注意从 1 开始的索引和包含数据的括号)。您不能对对象执行 whereJsonContains
。您应该将 JSON 根目录转换为数组,或者进行全面查找:
案例一:
[
{type: 0},
{type: 1}...
]
我建议这个代码:
DB::table('table')->whereJsonContains('column->type', 0)->get();
案例二
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
在尝试了多种建议后,我最终使用了这个代码:
$model->whereRaw("(
SELECT
COUNT(elements.*) > 0
FROM
jsonb_each(table.colum) elements
WHERE
elements.value->>'type' = ?
)", [$validated_request['type']]);
感谢您的帮助。
我在 table 列 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();