【问题标题】:Using Laravel 6.x eloquent (or similar method) to get row by JSON column data使用 Laravel 6.x eloquent(或类似方法)按 JSON 列数据获取行
【发布时间】:2022-02-11 00:12:24
【问题描述】:

当我从名为 workflow_conflicts 的表中对该特定模型运行 first() 时,我有以下 Laravel 6.x 集合输出。如您所见,conflicts 列是JSON 列,并以下面这种方式存储数据。

Models\WorkflowConflict {
     id: 2190,
     created_at: "2022-02-10 12:18:28",
     updated_at: "2022-02-10 12:22:36",
     action: "approved",
     conflicts: "[{"text": "validatorword 1218" "word": "validatorword", "indicies": {"end": 13, "start": 0}, "workflow_id": 4334}]",
     user: Models\User {
       id: 17843,
       suspended: 0,
     },
   }

我想弄清楚我将如何使用 Laravel Eloquent(我正在使用 Tinker)我将如何对冲突的 json 值执行搜索,例如来自 textword 的值。

例如 - 下面将在 Tinker 中很好地返回对象,但我不确定如何对 JSON 数据的 conflicts 行执行类似的搜索。

WorkflowConflict::where('action', 'approved')->first();

-- Tinker 内部的预期结果--

WorkflowConflict::where('conflicts->text', 'validatorword 1218')->first();
=> Models\WorkflowConflict {
     id: 2190,
     created_at: "2022-02-10 12:18:28",
     updated_at: "2022-02-10 12:22:36",
     action: "approved",
     conflicts: "[{"text": "validatorword 1218" "word": "validatorword", "indicies": {"end": 13, "start": 0}, "workflow_id": 4334}]",
     user: Models\User {
       id: 17843,
       suspended: 0,
     },
   }

-- Tinker 内部的实际结果--

WorkflowConflict::where('conflicts->text', 'validatorword 1218')->first();
=> null

TLDR - 尝试使用 Laravel 中的 JSON 列值进行搜索

【问题讨论】:

  • 你的 json 是一个数组吗? conflicts->text 如果没有被数组包裹,它会起作用:{"text": "validatorword 1218" "word": "validatorword", "indicies": {"end": 13, "start": 0}, "workflow_id": 4334}(无方括号)
  • 是的,这就是我们将它存储在数据库中的 json 数组中的方式

标签: php laravel eloquent laravel-6 tinker


【解决方案1】:

由于您的数据由数组包装,您可以使用whereRaw

WorkflowConflict::whereRaw('json_contains(conflicts, json_object("text", "validatorword 1218"))')->first();

【讨论】:

  • 完美的@Chin 这正是我想要的,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2020-10-22
  • 2020-11-06
相关资源
最近更新 更多