Подтвердить что ты не робот

Значение по умолчанию для миграции Laravel

Я не понял, каков эффект параметра default в переносах.

Я вижу, что столбец в базе данных определяется значением по умолчанию, но модели полностью игнорируют его. Скажем, у меня есть модель Book, которая отражает таблицу 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...

Значение по умолчанию игнорируется, и атрибут не устанавливается правильно. Хорошо, я могу получить его, потому что это новый объект, и он не должен получать значения по умолчанию из БД. Но, если я пытаюсь сохранить модель, например:

$book = new Book();
$book->author = 'Test'
$book->title = 'Test'
$book->save();

Он сохраняет 0 в поле price в базе данных!

Итак, какова точка параметра default в миграциях?

Кстати... Было бы не лучше, если модель увидит внутри миграции (если существует), какие типы полей и поведение вместо этого определяют ее вручную в модели и миграции? И более того, даже для автоматического создания валидатора для модели. Я думаю, что это было возможно с небольшим изменением структуры миграции, так почему это не так?

4b9b3361

Ответ 1

Поместите значение по умолчанию в одиночную кавычку, и оно будет работать по назначению. Пример миграции:

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

EDIT: в вашем случае → по умолчанию ('100.0');

Ответ 2

Вы можете просто поставить значение по умолчанию, используя default(). Смотри пример

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

Я использовал enum здесь и значение по умолчанию 0.

Ответ 3

Упомяните это в массиве $fillable вашей модели

protected $fillable = ['author', 'title', 'price',];