使用 Laravel 6.x eloquent (或类似方法)通过 JSON 列数据获取行

Using Laravel 6.x eloquent (or similar method) to get row by JSON column data

当我 运行 first() 来自一个名为 workflow_conflicts 的 table 的特定模型时,我有以下 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.

的值

例如 - 下面的内容 return Tinker 中的对象很好,但我不确定如何对 conflicts 行(即 JSON 数据)执行类似的搜索。

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 列值进行搜索

由于您的数据被数组包裹,您可以使用 whereRaw:

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