【发布时间】:2016-10-06 09:17:58
【问题描述】:
我不明白迁移中default 选项的作用是什么。
我可以看到数据库中的列是用默认值定义的,但是模型完全忽略了它。假设我有一个 Book 模型,它反映了数据库中的 books 表。我有迁移来创建 books 表:
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...
默认值被忽略,属性设置不正确。 好的,我可以得到它,因为它是一个新对象,它不应该从数据库中获取默认值。 但是如果我尝试保存模型,例如:
$book = new Book();
$book->author = 'Test'
$book->title = 'Test'
$book->save();
它是在数据库中的price字段中保存0!
那么迁移中default 选项的意义何在?
顺便说一句... 如果模型在迁移中看到(如果存在)字段类型和行为是什么而不是在模型和迁移中手动定义它,那不是更好吗?此外,甚至可以为模型自动创建验证器。我认为迁移结构的微小变化是可能的,那为什么不是这样呢?
【问题讨论】:
-
在 Laravel 文档中,它说“在修改列之前,请务必将教义/dbal 依赖项添加到 composer.json 文件。Doctrine DBAL 库用于确定列的当前状态并创建对列进行指定调整所需的 SQL 查询。”你有这种依赖吗?
-
我没有修改任何列,我为什么要这样?
-
因为
default($value)是迁移中的修饰符,这是修饰符的先决条件。