概要
LaravelのプロジェクトでJSON型を使おうとしたら
Default値が設定できなかったので
アプリケーション側でなんとかした。
内容
migrationファイル(一部省略)
2017_01_01_0123456_create_yakisoba_table.php
class CreateYakisobaTable extends Migration
{
public function up()
{
Schema::create('yakisobas', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->json('meta');
});
}
}
もちろんこれは適当なものです。
meta
フィールドに JSON
を設定しています。
それで、Modelをいつものように利用しようとします。 (一部省略)
YakisobaController.php
public function yakisoba()
{
Yakisoba::create([
'name' => 'ペヤング',
]);
}
すると
General error: 1364 Field 'meta' doesn't have a default value ...
デフォルト値が設定されていないので meta
がnullだとMySQL側でエラーになりました。
$table->json('meta')->nullable();
として
nullを許可すればいいのですが、極力nullはDBに入れないようにしてくれと。
そこでModelにて以下のように設定します。 (一部省略)
Yakisoba.php
class Yakisoba extends Model
{
protected $attributes = [
'meta' => '{}',
];
}
これでデフォルト値が実質アプリケーション側で設定できました。
ただし、これでは mata
を '{}'
の文字列として扱うことになるため、
Yakisoba.php
class Yakisoba extends Model
{
protected $attributes = [
'meta' => '{}',
];
// 追加
protected $casts = [
'meta' => 'array',
];
}
としてあげると、デフォルトで $yakisoba->meta
が []
の配列として
扱われていい感じですねヾ( ゚д゚)人( ゚д゚)ノ゙