В этом посте мы собираемся изучить тип данных JSON в MySQL 5.7 и во время погружения будем использовать платформу Laravel для построения запросов.
Для начала создадим новую таблицу:
И давайте добавим несколько значений:CREATE TABLE `products` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` JSON, `specs` JSON, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO products VALUES(
null,
'{"en": "phone", "it": "telefono"}',
'{"colors": ["black", "white", "gold"], "size": {"weight": 1, "height": 1}}'
);
INSERT INTO products VALUES(
null,
'{"en": "screen", "it": "schermo"}',
'{"colors": ["black", "silver"], "size": {"weight": 2, "height": 3}}'
);
INSERT INTO products VALUES(
null,
'{"en": "car", "it": "auto"}',
'{"colors": ["red", "blue"], "size": {"weight": 40, "height": 34}}'
);
Чтение значений JSON
Мы можем прочитать значения столбца JSON, используя простой синтаксис: select
name->"$.
en" as name,
specs->"$.
size.weight" as weight,
specs->"$.
colors" as colors
from products;
Мы получаем следующий результат:
имя | масса | цвета |
---|---|---|
'телефон' | 1 | ['черный', 'белый', 'золотой'] |
'экран' | 2 | ['черное серебро'] |
'машина' | 40 | ['красно синий'] |
json_decode( Products::selectRaw('name->"$.
en" as name')->first()->name )
О синтаксисе
Запросы в формате JSON выполняются с помощью оператора " -> ", помещая имя столбца оператора слева и синтаксис пути справа.Чтобы представить документ в формате JSON, за которым следует селектор, синтаксис PATH использует ведущий $ для указания на определенные части документа.
Вот различные способы получения данных:
- спецификации-> "$.
colors" вернет массив цветов
- спецификации-> "$.
colors[0]" вернет строку JSON «черная»
- спецификации-> "$.
non_existing" вернет НУЛЬ
- specs-> "$.
'имя ключа с пробелом'" если ключ содержит пробелы
Использование замен
Вы также можете использовать маску для запроса значений JSON. Допустим, у нас есть следующие данные: {"name": "phone", "price": 400, "sizes": [3, 4, 5]}
Синтаксис | Результат | Примечание |
---|---|---|
характеристики-> "$.
*" |
['телефон', [3, 4, 5], [{'имя': 'черный'}, {'имя': 'золотой'}]] | |
спецификации-> "$.
sizes[*]" |
[3, 4, 5] | То же, что и $.
sizes |
specs-> "$.
colors**. name" |
['черное золото'] | Синтаксис «префикс**суффикс» будет запрашивать все пути, начинающиеся с префикса и заканчивающиеся суффиксом.
|
Запрос значения в формате JSON
Это работает так же, как и с обычными столбцами MySQL. Теперь, когда мы знаем, как написать правильный путь для запроса и/или сортировки значений в формате JSON, давайте рассмотрим несколько примеров: select name->"$.
en" from products where name->"$.
en" = "phone";
select name->"$.
en" from products where name->"$.
en" IN ("phone");
select specs->"$.
size.weight" from products where specs->"$.
size.weight" BETWEEN 1 AND 10;
select * from products ORDER BY name->"$.
en";
Тип данных JSON в среде MySQL и Laravel
Если вы используете фреймворк Laravel версии 5.2.23 или выше, вы сможете свободно использовать построитель запросов для генерации запроса в формате JSON: Product::where('name->en', 'car')->first();
Product::whereIn('specs->size->weight', [1, 2, 3])->get();
Product::select('name->en')->orderBy('specs->size->height', 'DESC')->get();
Если нет, то вам нужно использовать СЫРОЙ :
Product::whereRaw('name->"$.
en"', 'car')->first();
Заключение
Во многих случаях разработчики предпочитают базу данных NoSQL из-за ее функций, гибкости и/или производительности, однако базы данных SQL являются предпочтительными, и многие крупные компании полагаются на них для разработки продуктивных веб-приложений с использованием комбинации MySQL + (Mongo|Redis|).и т. д.), но это усложняет стек.
С появлением типа данных JSON в MySQL он стал своего рода гибридной базой данных SQL-NoSQL.
От переводчика
В примерах, где видны «елочки», нужно ставить «кавычки».Вот как их обрабатывает Хабр.
Теги: #Laravel #laravel 5.2.23 #mysql 5.7 #json #MySQL #Laravel
-
Решения Oracle Для Бизнес-Аналитики
19 Oct, 24 -
Зам-С — Выпуск №52
19 Oct, 24