#MySQLでJSON型っていうのがあるらしい
データベースの設計で「う~ん」と悩みながらググっていると
MySQLにはJSON型というのがあるらしい。
確かどこかの本でデータベースに配列を1つのセルに格納するのはアンチパターンというのを読んだ気がするのだが
どうやらちゃんとJSONデータ内部のクエリもちゃんとできるんだとか…。
でもMySQL5.7くらい以上じゃないと対応していないらしい。
MariaDBは10.2以上が対応みたい。
#Laravelで上手く扱えるの?
でもこの世はLaravel以外は人権の無い時代。
Laravelが対応してなきゃ、SQL力が試されることになるが…
もちろんちゃんと対応してた、やっぱLaravel神だは。
#migrationの書き方
public function up()
{
Schema::create('table_name', function (Blueprint $table) {
$table->json('json_type_column')->nullable()->default('[]');
$table->timestamps();
});
}
integer()
やstring()
のように、json()
で型を指定する。
基本的にnullable()
付けとけば安心。
もしdefault制約を付けたい場合はdefault()
の引数にJSON文字列を与えればオッケー。
json_encode()
を使えば簡単に書けるから問題は無さそう。
内部的にはどうやら型はLONGTEXT
で作られているみたい(JSON型じゃないんか~い
#modelの書き方
protected $table = 'table_name';
protected $fillable = [
'json_type_column',
];
protected $casts = [
'json_type_column' => 'json',
];
いつものようにmodelは書いても大丈夫だけどキャスト型を指定してあげなければいけない。
こちらもinteger
やstring
のように、json
として指定してあげる。
この$casts
を指定しないと、ただのstring
としてしか扱えない。
#クエリビルダの書き方 create編
ModelName::create([
'json_type_column' => [
'abc' => [
'X' => 1,
'Y' => 2,
'Z' => 3,
],
'cdf' => '456',
],
]);
わざわざjson_encode
でJSON文字列にしなくても大丈夫!(というかjson_encodeするとエラーを吐く
["a","b","c"]
のような素の配列も格納できるが、クエリを掛けるときに不便になりがちなので
なるべくは連想配列で格納してあげると良さげ。
#クエリビルダの書き方 where編
//「->」でアクセスする感じ
ModelName::where('json_type_column->abc->Z', 3)->first()->json_type_column;
//型比較はゆるい
ModelName::where('json_type_column->cdf', 456)->first()->json_type_column;
//LIKE検索も出来る
ModelName::where('json_type_column->cdf', 'LIKE', '%5%')->first()->json_type_column;
//こんな事も出来る
ModelName::where('json_type_column->abc', 'LIKE', '3')->first()->json_type_column;
困ることは無さそうな感じ。
あくまでJSON文字列で格納されているという事を理解できていれば大丈夫。
ちなみに上記の例のjson_type_column
は連想配列として返ってきている。
#まとめ
やっぱLaravelは神だは!!!!!