Laravel迁移默认值



我不明白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。

最新更新