環境
- Laravel 5.5
- MySQL 5.7
結論
- MySQLはバージョン5.7以降から JSON 型カラムを使用できる
- JSON 型カラムに配列を json_encode() したものを insert しようとするとうまくいかない
- JSON 型カラムには配列を insert する
実装
以下のような members テーブルがあるとする。
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| data | json | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
正
Laravel で Member モデルがあるとして、以下のようにする。
$data = [
'name' => 'kamikosi',
'env' => [
'language' => 'PHP',
'framework' => 'Laravel',
],
];
$member = new Member;
$member->data = $data;
$memver->save();
誤
最初、 JSON 型だからと json_encode() の返り値を入れようとした。
$data = [
'name' => 'kamikosi',
'env' => [
'language' => 'PHP',
'framework' => 'Laravel',
],
];
$member = new Member;
$member->data = json_encode($data, JSON_UNESCAPED_UNICODE)
$member->save();
save() 自体はうまくいくが、 data カラムの中身は以下のようになる。
"{"name":"kamikosi","env":{"language":"PHP","framework":"Laravel"}}"
json_encode() の返り値は String 型なので、両端にダブルクォーテーションが付く。また JSON のキーおよび値にもダブルクォーテーションが付く。結果として最初に2つのダブルクォーテーションで囲まれる文字列は {
となり、 MySQL は JSON 型カラムを正しく処理できなくなる。