我不明白迁移中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...
忽略默认值,并且未正确设置属性。 好的,我可以得到它,因为它是一个新对象,它不应该从DB获取默认值。 但如果我尝试保存模型:
$book = new Book();
$book->author = 'Test'
$book->title = 'Test'
$book->save();
在数据库中的price
字段中保存 0 !
那么迁移中的default
选项有什么意义呢?
顺便说一下...... 如果模型在迁移内部(如果存在)看到字段类型和行为是什么而不是在模型和迁移中手动定义它并不是更好?而且,甚至可以自动为模型创建验证器。我认为迁移结构的变化可能很小,为什么它不是那样的呢?
答案 0 :(得分:57)
将默认值放在单引号中,它将按预期工作。迁移的一个例子:
$table->increments('id');
$table->string('name');
$table->string('url');
$table->string('country');
$table->tinyInteger('status')->default('1');
$table->timestamps();
在您的情况下编辑 - >默认('100.0');
答案 1 :(得分:0)
您可以使用default()简单地放入默认值。参见示例
$table->enum('is_approved', array('0','1'))->default('0');
我在这里使用了枚举,默认值为0。
答案 2 :(得分:0)
在Laravel 6中,您必须按如下所示向迁移文件添加“更改”:
$table->enum('is_approved', array('0','1'))->default('0')->change();
答案 3 :(得分:0)
参加聚会可能为时已晚,但是希望这对遇到类似问题的人有所帮助。
默认值不起作用的原因是因为迁移文件在数据库(MySQL或PostgreSQL或其他)中设置了默认值,而不是在Laravel应用程序中设置了默认值。
让我举例说明。
此行表示Laravel如模型中所指定,正在生成一个新的Book实例。根据与模型关联的表,新的Book
对象将具有属性。到目前为止,数据库上还没有任何内容。
$book = new Book();
现在,以下几行正在设置Book
对象的每个属性的值。还是一样,数据库上什么都没有写。
$book->author = 'Test'
$book->title = 'Test'
这一行是写到数据库的那一行。将对象传递到数据库后,数据库将填充空白字段(可以是默认值,可以为null或在迁移文件上指定的任何内容)。
$book->save();
因此,默认值在保存到数据库之前不会弹出。
但是,这还不够。如果您尝试访问$book->price
,它将仍然为空(或0,我不确定)。保存只是将默认值添加到数据库中的记录,并且不会影响您随身携带的对象。
因此,要获取具有填充默认值的实例,您必须重新获取该实例。您可以使用
Book::find($book->id);
或者,通过刷新实例的更复杂的方式
$book->refresh();
然后,下次尝试访问该对象时,它将使用默认值填充。
答案 4 :(得分:-2)
您面临的问题与迁移文件无关。该值每次都变为 0,因为您没有在模型上更改 $fillable。当您忘记将最近添加的列添加到其模型的 $fillable 时,Laravel 会插入 0。
答案 5 :(得分:-5)
在模型的可填充数组中提及它 protected $ fillable = [ '作者','标题','价格', ];