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
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
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

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