【问题标题】:Eloquent Where clause for nested jsonb. postgresql用于嵌套 jsonb 的雄辩的 Where 子句。 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'])
  • 我试过了,但也没用

标签: laravel postgresql eloquent laravel-query-builder


【解决方案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();
      

      【讨论】:

        猜你喜欢
        • 2017-10-18
        • 2014-09-20
        • 1970-01-01
        • 2021-02-13
        • 2018-05-19
        • 2022-01-07
        • 1970-01-01
        • 2021-05-29
        • 2015-07-09
        相关资源
        最近更新 更多