web-dev-qa-db-ja.com

Laravel移行のデフォルト値

移行におけるdefaultオプションの効果が何であるか理解できませんでした。

データベースの列がデフォルト値で定義されていることがわかりますが、モデルはそれを完全に無視しています。データベースのBookテーブルを反映するbooksモデルがあるとします。 booksテーブルを作成するための移行があります。

Schema::create('bools', 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();

データベースのpriceフィールドにが保存されます!

では、移行のdefaultオプションのポイントは何ですか?

ちなみに...モデルが移行内で(存在する場合)モデルと移行で手動で定義する代わりにフィールドのタイプと動作を確認するのは良くありませんでしたか?さらに、モデルのバリデーターを自動的に作成することもできます。移行構造を少し変更するだけで可能になったと思いますが、なぜそうではないのですか?

30
nrofis

デフォルト値を一重引用符で囲むと、意図したとおりに機能します。移行の例:

$table->increments('id');
            $table->string('name');
            $table->string('url');
            $table->string('country');
            $table->tinyInteger('status')->default('1');
            $table->timestamps();

EDIT:あなたの場合-> default( '100.0');

67
Khan Shahrukh

Default()を使用して、デフォルト値を簡単に設定できます。例を見る

 $table->enum('is_approved', array('0','1'))->default('0');

ここでは列挙型を使用しましたが、デフォルト値は0です。

1