Laravel ищет в столбце Json числа между двумя значениями

#php #regex #laravel

Вопрос:

У меня есть столбец viewers JSON в products таблице, содержащий аналогичный пример значения:

 [{"at": "2021-06-21T18:58:39", "age": 30, "country_iso_code": "US"}, {"at": "2021-06-18T11:13:13", "age": 20, "country_iso_code": "PH"}, {"at": "2021-06-25T23:57:12", "age": 45, "country_iso_code": "ET"}, {"at": "2021-06-27T17:01:14", "age": 18, "country_iso_code": "DZ"}
 

Итак, я пытаюсь получить строки, содержащие числа между двумя значениями свойств JSON age, например, возраст от 20 до 30 лет.

Я пытался использовать красноречивый метод WhereJsonContains , но он работает только с точными числовыми значениями (насколько я знаю).:

 $query->orWhereJsonContains('viewers', [
    'age' => 20
]);
 

этот код в основном вернет следующий запрос:

 select * from `products` where (json_contains(`viewers`, '{"age":"20"}'))
 

Есть ли способ, которым я могу справиться с этим, чтобы использовать промежуток? может быть, решение с регулярным выражением

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

1. Есть ли у вас возможность добавить несколько предложений, например, перебирать [20...30] и добавлять orWhereJsonContains(... 'age' => $i) ?

2. Опасно хранить возраст в любом месте базы данных, он может быть правильным, когда вы его вставляете, но завтра, скорее всего, он будет неправильным, как правильный

3. @nitrin0 спасибо за предложение, которое я обдумал, но я думаю, что это создаст много запросов, например, в возрасте от 18 до 80 лет, я ищу решение для одного запроса, такое как регулярное выражение.

4. @RiggsFolly бизнес-модель вынуждает нас это делать, так как другого решения банкомата нет.

5. Это ужасный способ хранения данных (хорошо, если вы хотите сделать его почти непригодным для использования), помните, что по какой-либо другой причине длина строки mysql ограничена, и она не так велика, как вы могли бы подумать. Если этот столбец используется для многих случаев какой-либо деятельности, у вас скоро закончится место. См. руководство