首页 > 解决方案 > 用于嵌套 jsonb 的雄辩的 Where 子句。PostgreSQL

问题描述

我的表中有一个列,如下所示:

{
  1:{type: 0},
  2:{type: 1}...
}

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

标签: laravelpostgresqleloquentlaravel-query-builder

解决方案


在根目录下,您的 JSON 不是一个数组,而是一个对象(注意从 1 开始的索引和包含数据的括号)。你不能whereJsonContains对物体进行表演。您应该将 JSON 根转换为数组,或者进行全面查找:

情况1:

[
  {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


推荐阅读