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, используя построитель запросов или необработанный запрос?

Взгляните на предложения JSON where в документации здесь

geertjanknapen 14.02.2023 14:41

@geertjanknapen У меня есть опыт использования этого построителя и необработанных SQL-запросов, я просто сталкиваюсь с трудностями с массивом объектов.

medilies 14.02.2023 14:52
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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()

Хороший ответ, но извините, моему вопросу не хватило точности (я его отредактировал). Мне нужно value=1 AND type='static' на том же key_two объекте.

medilies 14.02.2023 16:37

Я отредактировал свой ответ, но опять же, просто создайте их так, как они выглядят в php-массиве.

silver 14.02.2023 16:47

Я даже умею whereJsonContains('json_col', [['key_two' => ['type'=>'static'], 'key_one'=>4]). спасибо за четкий ответ

medilies 15.02.2023 10:18

вам не хватает квадратной скобки ] перед 4 в вашем примере, но да, легко выполнить запрос с объектом json в laravel, хотя это зависит от того, как вы их храните и извлекаете, и иногда выполнение поиска %LIKE% может быть кошмаром

silver 15.02.2023 10:47

Другие вопросы по теме