LoginSignup
5
4

More than 5 years have passed since last update.

MySQLのJSON型でdefault値が設定できなかったので。 with Laravel

Posted at

概要

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[] の配列として
扱われていい感じですねヾ( ゚д゚)人( ゚д゚)ノ゙

5
4
0

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
5
4