英文:
Laravel: query JSON column that has array of objects
问题
如何使用查询生成器或原始查询获取具有key_two
中value
= 1
和type
= static
的行35
?
请注意,上述查询是使用JSON数据的条件进行检索的示例。您可以使用不同的数据库查询生成器或原始查询来实现此目标,具体取决于您所使用的数据库系统和编程语言。以下是一种可能的方法,供您参考:
使用 Laravel 查询生成器(如果您在使用 Laravel 框架):
$desiredRow = DB::table('your_table_name')
->where('id', 35)
->whereJsonContains('json_col', [
['key_two.value' => 1, 'key_two.type' => 'static']
])
->first();
在上述示例中,我们使用whereJsonContains
方法来检查json_col
列中的JSON数据是否包含指定的条件。
如果您使用不同的数据库系统或编程语言,请查阅相关文档以了解如何执行此类JSON条件查询。
英文:
I have a table that looks like this:
id | json_col |
---|---|
35 | [{"key_one":4,"key_two":{"value":1,"type":"static"}},{"key_one":27,"key_two":{"value":26,"type":"dynamic"}}] |
36 | [{"key_one":2,"key_two":{"value":33,"type":"static"}},{"key_one":9,"key_two":{"value":1,"type":"any"}}] |
[
{
"id": 35,
"json_col": [
{
"key_one": 4,
"key_two": {
"value": 1,
"type": "static"
}
},
{
"key_one": 27,
"key_two": {
"value": 26,
"type": "dynamic"
}
}
],
"created_at": "2023-02-13T16:54:13.000000Z",
"updated_at": "2023-02-13T16:54:13.000000Z"
},
{
"id": 36,
"json_col": [
{
"key_one": 2,
"key_two": {
"value": 33,
"type": "static"
}
},
{
"key_one": 9,
"key_two": {
"value": 1,
"type": "any"
}
}
],
"created_at": "2023-02-13T16:54:56.000000Z",
"updated_at": "2023-02-13T16:54:56.000000Z"
}
]
How to get the row 35
that has key_two
with value
= 1
and type
= static
, using the query builder or a raw query?
答案1
得分: 1
你可以根据存储方式使用whereJsonContains来处理多维数组。
return Model::whereJsonContains('json_col', [['key_two' => ['value' => 1]]])
->whereJsonContains('json_col', [['key_two' => ['type' => 'static']]])
->paginate(10); // 或者使用 get()
仅需仔细检查SQL输出是否确实与你的JSON格式相似,应该如下所示:
WHERE json_contains(`json_col`, '[{"key_two":{"value":1}}]')
AND json_contains(`json_col`, '[{"key_two":{"type":"static"}}]')
编辑
如果你需要在单个对象中搜索多个匹配项,可以使用以下方法:
return Model::whereJsonContains('json_col', [['key_two' => ['value' => 1, 'type' => 'static']])
->paginate(10); // 或者使用 get()
英文:
you can use whereJsonContains with multi-dimentional array base on how you store them.
return Model::whereJsonContains('json_col', [ ['key_two' => [ 'value' => 1] ] ])
->whereJsonContains('json_col', [ ['key_two' => [ 'type' => 'static'] ] ])
->paginate(10); // or get()
just double check the sql output actually looks like your json format which should look something like
WHERE json_contains(`json_col`, '[{\"key_two\":{\"value\":1}}]')
AND json_contains(`json_col`, '[{\"key_two\":{\"type\":\"static\"}}]')
EDIT
If you need to search multiple match in single object, then this should do
return Model::whereJsonContains('json_col', [ ['key_two' => [ 'value' => 1, 'type' => 'static' ] ] ])
->paginate(10); // or get()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论