MySQL JSONデータ型のデコード

この投稿では、MySQL 5.7のJSONデータ型を調べ、ダイビング中に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形式の文字列として取得されます。つまり、画面に表示する前にデコードする必要があります。

 json_decode( Products::selectRaw('name->"$.en" as name')->first()->name ) 


構文について



JSON形式のクエリは、「 -> 」演算子を使用して実行され、演算子列の名前が左側に、パス構文が右側に配置されます。

セレクターが後に続くJSON形式でドキュメントを表すために、PATH構文は先頭の$を使用してドキュメントの特定の部分を示します。 データを取得するさまざまな方法を次に示します。



キーが有効なECMAScript識別子でない場合は、パス内で引用符で囲む必要があります。

ルックアップを使用する



マスクを使用してJSON値を要求することもできます。 次のデータがあるとします。

 {"name": "phone", "price": 400, "sizes": [3, 4, 5]} 


構文結果ご注意
仕様-> "$。*"['phone'、[3、4、5]、[{'name': 'black'}、{'name': 'gold'}]]
仕様-> "$。サイズ[*]"[3、4、5]$ .sizesと同じ
仕様-> "$。色**。名前"[「黒」、「金」]構文「prefix ** suffix」は、プレフィックスで始まり、サフィックスで終わるすべてのパスを要求します。


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"; 


MySQL JSONデータ型と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(); 


そうでない場合は、 RAWを使用する必要があります。

 Product::whereRaw('name->"$.en"', 'car')->first(); 


おわりに



多くの場合、開発者は特定の機能、柔軟性、および/またはパフォーマンスのためにNoSQLデータベースを好みますが、SQLデータベースが好まれ、多くの大企業はMySQL +バンドル(Mongo | Redis |など)が、これによりスタックが複雑になります。 MySQLにJSONデータ型が導入されたため、一種のハイブリッドSQL-NoSQLデータベースになりました。

翻訳者から


「クリスマスツリー」が表示されている例では、「引用符」を付ける必要があります。 このHabrはそれらを処理します。

Source: https://habr.com/ru/post/J279155/


All Articles