#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
в конце. Попробуйте сейчас.