我使用的是Laravel Framework version 5.2.7
。我创建了一个数据库迁移,如下所示:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateLessonsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('lessons', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->boolean('some_bool');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('lessons');
}
}
我进入虚拟机的MySql数据库并使用命令desc lessons;
,这是我得到的:
我不明白为什么created_at
和updated_at
列将NULL
设置为Default
。我在Laravel 5.2文档中看到了以下内容:
x1米6英寸x1米7英寸
所以根据文档$table->timestamps();
不应该允许NULL
作为Default
。但是我仍然得到created_at
和updated_at
列,其中NULL
作为Default
。我很困惑。请帮助!!
实际上,这些列应该像下面的表:
5条答案
按热度按时间wsxa1bj11#
如果在模式构建器中使用
$table->timestamp('created_at')
而不是$table-timestamps()
,则默认值将是CURRENT_TIMESTAMP
,而不是NULL
。存储记录的更新时间同样:
$table->timestamp('updated_at')
.区别仅在于一个字母**'s '**,并且必须提及列名,例如
created_at
/created
、updated_at
/updated
。vuktfyat2#
只是提醒一下,因为Laravel 5.2.14的时间戳在默认情况下是可空的。
Blueprint.php:
关于这个问题的讨论可以在Github上找到。
泰勒·奥特韦尔:我个人认为-〉timestamps()应该默认为-〉nullableTimestamps()来解决这个问题。
摘自Github期刊https://github.com/laravel/framework/issues/12060#issuecomment-179249086
提交中的更改:使时间戳默认为空https://github.com/laravel/framework/commit/720a116897a4cc6780fa22f34d30c5986eafc581
ma8fv8wu3#
不知道这是否回答了问题,但...
默认的
timestamp
方法(至少在Laravel 5.4中)输出以下SQL:这就是您要查找的内容。如果您将
timestamp
列设置为nullable
,则默认值将为NULL
,并且允许为空。因此,
将给出以下SQL:
jpfvwuh44#
它不允许
NULL
,如您在Null
列中所见,它们都设置为NO
niwlg2el5#
自Laravel 5.5起:
使用
not null, default CURRENT_TIMESTAMP
生成列。https://laravel.com/docs/5.5/migrations#column-modifiers
在Laravel 9.x中仍然有效。
https://laravel.com/docs/9.x/migrations#column-modifiers