Значение по умолчанию для миграции 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
в миграциях?
Кстати...
Было бы не лучше, если модель увидит внутри миграции (если существует), какие типы полей и поведение вместо этого определяют ее вручную в модели и миграции? И более того, даже для автоматического создания валидатора для модели. Я думаю, что это было возможно с небольшим изменением структуры миграции, так почему это не так?
Ответы
Ответ 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',];