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();