mariadb Laravel:查询包含对象数组的JSON列

vfh0ocws  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(163)

我有一个类似这样的表:
| 身份证|json_列|
| - ------|- ------|
| 三十五|[{"密钥一":4,"密钥二":{"值":1,"类型":"静态"}},{"密钥一":27,"密钥二":{"值":26,"类型":"动态"}}]|
| 三十六|[{"密钥一":2,"密钥二":{"值":33,"类型":"静态"}},{"密钥一":9,"密钥二":{"值":1,"类型":"任何"}}]|

[
    {
        "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"
    }
]

如何使用查询生成器或原始查询获取包含key_twovalue = 1type = static的行35

vbopmzt1

vbopmzt11#

您可以根据存储多维数组方式将whereJsonContains与多维数组一起使用。

return Model::whereJsonContains('json_col', [ ['key_two' => [ 'value' => 1] ] ])
            ->whereJsonContains('json_col', [ ['key_two' => [ 'type' => 'static'] ] ])
            ->paginate(10); // or 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); // or get()

相关问题