default
移行におけるオプションの効果を理解していませんでした。
データベースの列はデフォルト値で定義されていますが、モデルはそれを完全に無視していることがわかります。データベースのテーブルBook
を反映するモデルがあるとしますbooks
。books テーブルを作成するための移行があります。
Schema::create('books', function (Blueprint $table) {
$table->increments('id');
->string('author');
->string('title');
->decimal('price', 4, 1)->default(100);
->timestamps();
});
Book
モデルの新しいインスタンスを作成すると、次のように表示されます。
$book = new Book();
var_dump($book->price); //Always 0...
デフォルト値は無視され、属性は正しく設定されません。これは新しいオブジェクトであり、DB からデフォルト値を取得するべきではないため、取得できます。しかし次のようにモデルを保存しようとすると:
$book = new Book();
$book->author = 'Test'
$book->title = 'Test'
$book->save();
それは保存されます0price
データベースのフィールドに!
default
では、移行におけるオプションの目的は何でしょうか?
ところで... モデルと移行で手動で定義するのではなく、モデルが移行内 (存在する場合) でフィールド タイプと動作を確認できればもっと良いのではないでしょうか。さらに、モデルのバリデーターを自動的に作成することもできます。移行構造を少し変更するだけで可能だったと思うのですが、なぜそうしないのでしょうか。
ベストアンサー1
デフォルト値を一重引用符で囲むと、意図したとおりに動作します。移行の例:
$table->increments('id');
$table->string('name');
$table->string('url');
$table->string('country');
$table->tinyInteger('status')->default('1');
$table->timestamps();
編集 :あなたの場合 ->default('100.0');