laravel 5.2.7 中的时间戳具有默认空值
timestamps in laravel 5.2.7 have default null values
我正在使用 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 文档并看到了这个:
$table->timestamps(); Adds created_at and updated_at columns.
$table->nullableTimestamps(); Same as timestamps(), except allows NULLs.
因此根据文档 $table->timestamps();
不应允许 NULL
为 Default
。但我仍然得到 created_at
和 updated_at
列 NULL
作为 Default
。我很困惑。请帮忙!!
事实上这些列应该是这样的table:
它不允许 NULL
正如您在 Null
列中看到的那样,它们都设置为 NO
如果您在架构构建器中使用 $table->timestamp('created_at')
而不是 $table-timestamps()
,则默认值将为 CURRENT_TIMESTAMP
而不是 NULL
。
同样存储一条记录的更新时间:
$table->timestamp('updated_at')
.
区别仅在于一个字母 's' 并且必须提及列名称,例如 created_at
/created
、updated_at
/updated
.
不确定这是否回答了问题但是...
默认的timestamp
方法(至少在Laravel 5.4中)输出以下SQL:
`my_new_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
这就是您要找的。如果将 timestamp
列设置为 nullable
,则默认值将为 NULL
并允许空值。
所以:
$table->timestamp('my_new_timestamp')->nullable();
会给出以下 SQL:
`my_new_timestamp` timestamp NULL DEFAULT NULL
提醒一下,因为 Laravel 5.2.14 时间戳在默认情况下可以为空。
Blueprint.php:
/**
* Add nullable creation and update timestamps to the table.
*
* @param int $precision
* @return void
*/
public function timestamps($precision = 0)
{
$this->timestamp('created_at', $precision)->nullable();
$this->timestamp('updated_at', $precision)->nullable();
}
有关此的讨论可在 Github 上阅读。
Taylor Otwell: Personally I think ->timestamps() should just default to ->nullableTimestamps() to solve this issue.
来自Github期https://github.com/laravel/framework/issues/12060#issuecomment-179249086
在提交中更改:默认情况下使时间戳可为空
https://github.com/laravel/framework/commit/720a116897a4cc6780fa22f34d30c5986eafc581
我正在使用 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 文档并看到了这个:
$table->timestamps(); Adds created_at and updated_at columns.
$table->nullableTimestamps(); Same as timestamps(), except allows NULLs.
因此根据文档 $table->timestamps();
不应允许 NULL
为 Default
。但我仍然得到 created_at
和 updated_at
列 NULL
作为 Default
。我很困惑。请帮忙!!
事实上这些列应该是这样的table:
它不允许 NULL
正如您在 Null
列中看到的那样,它们都设置为 NO
如果您在架构构建器中使用 $table->timestamp('created_at')
而不是 $table-timestamps()
,则默认值将为 CURRENT_TIMESTAMP
而不是 NULL
。
同样存储一条记录的更新时间:
$table->timestamp('updated_at')
.
区别仅在于一个字母 's' 并且必须提及列名称,例如 created_at
/created
、updated_at
/updated
.
不确定这是否回答了问题但是...
默认的timestamp
方法(至少在Laravel 5.4中)输出以下SQL:
`my_new_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
这就是您要找的。如果将 timestamp
列设置为 nullable
,则默认值将为 NULL
并允许空值。
所以:
$table->timestamp('my_new_timestamp')->nullable();
会给出以下 SQL:
`my_new_timestamp` timestamp NULL DEFAULT NULL
提醒一下,因为 Laravel 5.2.14 时间戳在默认情况下可以为空。
Blueprint.php:
/**
* Add nullable creation and update timestamps to the table.
*
* @param int $precision
* @return void
*/
public function timestamps($precision = 0)
{
$this->timestamp('created_at', $precision)->nullable();
$this->timestamp('updated_at', $precision)->nullable();
}
有关此的讨论可在 Github 上阅读。
Taylor Otwell: Personally I think ->timestamps() should just default to ->nullableTimestamps() to solve this issue.
来自Github期https://github.com/laravel/framework/issues/12060#issuecomment-179249086
在提交中更改:默认情况下使时间戳可为空 https://github.com/laravel/framework/commit/720a116897a4cc6780fa22f34d30c5986eafc581