laravel 5.2.7中的时间戳具有默认的空值

时间:2016-01-11 10:22:45

标签: php mysql laravel-5.2

我正在使用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;,这就是我得到的:enter image description here

我不明白为什么created_atupdated_at列的NULLDefault。 我去了La​​ravel 5.2文档并看到了这个:

$table->timestamps(); Adds created_at and updated_at columns. $table->nullableTimestamps(); Same as timestamps(), except allows NULLs.

因此,根据文档$table->timestamps();,不应允许NULLDefault。但我仍然得到created_atupdated_at列,NULLDefault。我糊涂了。请帮助!!

事实上,这些专栏应该像这张表:enter image description here

4 个答案:

答案 0 :(得分:3)

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

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

不同之处仅在于一个字母&#39; ,并且必须提及列名称,例如created_at / created,{{1} } / updated_at

答案 1 :(得分:1)

不确定这是否正在回答问题,但......

默认的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

答案 2 :(得分:0)

如您在NULL列中所见,它不允许Null,它们都设置为NO

答案 3 :(得分:0)

请注意,因为默认情况下,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:我个人认为-> timestamps()应该默认为-> nullableTimestamps()来解决此问题。

摘自Github问题https://github.com/laravel/framework/issues/12060#issuecomment-179249086

更改提交:默认使时间戳为空 https://github.com/laravel/framework/commit/720a116897a4cc6780fa22f34d30c5986eafc581