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