Как выполнить поиск по имени неизвестного свойства в базе данных с помощью Laravel

#php #mysql #laravel #mysql-json

#php #mysql #laravel #mysql-json

Вопрос:

Я пытаюсь выполнить поиск в базе данных с помощью json, содержащего метод laravel. Вот мой JSON одной строки базы данных:

 {
    "row": {
        "1": {
            "ID":"110555175667"
        },
        "2": {
            "ID":"11023235667"
        },
        "3": {
            "ID":"11001414141667"
        },
        "4": {
            "ID":"11023235667"
        },
        "5": {
            "ID":"1100012222225667"
        },
    }
}
 

Я хочу выполнить поиск по идентификатору, но, как вы видите, в качестве свойств указаны числа.

В примере я хочу найти 11023235667 . Я пробовал это так:

 ->whereJsonContains('json', [['row' => ['1' => ['ID' => '11023235667']]]])
 

Но это не сработало. Как я могу это сделать?

Редактировать:

Я также пробовал это:

 ->whereRaw('JSON_CONTAINS(json, "$.row.*.ID", "11023235667")')
 

Я знаю, что свойство row должно быть массивом JSON для соответствия идентификатору, но оно было установлено как объект JSON

Ответ №1:

Использование JSON_CONTAINS() принимает документ JSON в качестве второго аргумента, а не путь.

Вы можете использовать этот путь для извлечения идентификаторов в массив:

 SELECT JSON_EXTRACT(json, '$.row.*.ID') FROM ...
 -------------------------------------------------------------------------------------- 
| ["110555175667", "11023235667", "11001414141667", "11023235667", "1100012222225667"] |
 -------------------------------------------------------------------------------------- 
 

Используя это, вы можете выполнить поиск в результирующем массиве:

 SELECT ... FROM mytable 
WHERE JSON_SEARCH(JSON_EXTRACT(json, '$.row.*.ID'), 'one', '11023235667') IS NOT NULL;
 

Вам нужно будет сделать это с помощью whereRaw() в Laravel, потому что в Laravel нет встроенной функции построения запросов для этого выражения.

Совет: Как только вы ссылаетесь на столбец JSON в WHERE предложении SQL-запроса, ваш запрос становится сложнее написать и сложнее оптимизировать. Это должно быть красным флагом, указывающим на неправильный дизайн. Вам было бы лучше хранить данные в обычных строках и столбцах, а не в формате JSON.

Комментарии:

1. Спасибо вам за ваш ответ. Я применил ваш код как SELECT JSON_EXTRACT(json, '$.row.*.ID') FROM mytable WHERE JSON_SEARCH(JSON_EXTRACT(json, '$.row.*.ID'), 'one', '11023235667') , но он вернул пустой результат. Кстати, спасибо за ваши советы, я всего лишь разработчик проекта, я собираюсь сообщить об этом менеджеру проекта.

2. Мои извинения! Кажется, я забыл IS NOT NULL в конце. Попробуйте сейчас.