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_atupdated_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(); 不应允许 NULLDefault。但我仍然得到 created_atupdated_atNULL 作为 Default。我很困惑。请帮忙!!

事实上这些列应该是这样的table:

它不允许 NULL 正如您在 Null 列中看到的那样,它们都设置为 NO

如果您在架构构建器中使用 $table->timestamp('created_at') 而不是 $table-timestamps(),则默认值将为 CURRENT_TIMESTAMP 而不是 NULL

同样存储一条记录的更新时间: $table->timestamp('updated_at').

区别仅在于一个字母 's' 并且必须提及列名称,例如 created_at/createdupdated_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