使用 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 值执行搜索,例如来自 text
和 word
.
的值
例如 - 下面的内容 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();
当我 运行 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 值执行搜索,例如来自 text
和 word
.
例如 - 下面的内容 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();