#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 ограничена, и она не так велика, как вы могли бы подумать. Если этот столбец используется для многих случаев какой-либо деятельности, у вас скоро закончится место. См. руководство