LoginSignup
43
46

More than 3 years have passed since last update.

LaravelでJSON型のカラムを操作する

Posted at

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は書いても大丈夫だけどキャスト型を指定してあげなければいけない。
こちらもintegerstringのように、jsonとして指定してあげる。
この$castsを指定しないと、ただのstringとしてしか扱えない。

クエリビルダの書き方 create編

ModelName::create([
    'json_type_column'  => [
        'abc'   => [
            'X'  => 1,
            'Y'  => 2,
            'Z'  => 3,
        ],
        'cdf'   => '456',
    ],
]);

わざわざjson_encodeJSON文字列にしなくても大丈夫!(というか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は神だは!!!!!

43
46
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
46