Laravel: запросить столбец JSON с массивом объектов

У меня есть таблица, которая выглядит так:

идентификатор json_col 35 [{"key_one":4,"key_two":{"value":1,"type":"static"}},{"key_one":27,"key_two":{"value":26,"type" :"динамический"}}] 36 [{"key_one":2,"key_two":{"значение":33,"тип":"статический"}},{"key_one":9,"key_two":{"значение":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"
    }
]

Как получить строку 35, в которой есть key_two с value = 1 и type = static, используя построитель запросов или необработанный запрос?

🤔 А знаете ли вы, что...
SQL используется для создания, изменения и управления данными в базах данных.


52
1

Ответ:

Решено

вы можете использовать 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()