【问题标题】:timestamps in laravel 5.2.7 have default null valueslaravel 5.2.7 中的时间戳具有默认的空值
【发布时间】:2016-04-15 14:48:31
【问题描述】:

我正在使用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-&gt;timestamps(); Adds created_at and updated_at columns. $table-&gt;nullableTimestamps(); Same as timestamps(), except allows NULLs.

所以根据文档$table-&gt;timestamps(); 不应该允许NULL 作为Default。但我仍然得到created_atupdated_at 列,其中NULL 作为Default。我糊涂了。请帮忙!!

事实上这些列应该像这张表:

【问题讨论】:

    标签: php mysql laravel-5.2


    【解决方案1】:

    提醒一下,因为 Laravel 5.2.14 时间戳默认为空。

    蓝图.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

    【讨论】:

      【解决方案2】:

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

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

      区别只是一个字母's',还得提列名如created_at/created,updated_at/updated

      【讨论】:

      • $table-&gt;timestamp('added_on'); - 使用 CURRENT_TIMESTAMP 但$table-&gt;timestamp('created_date'); 没有。
      【解决方案3】:

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

      默认的timestamp 方法(至少在 Laravel 5.4 中)输出以下 SQL:

      `my_new_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
      

      您正在寻找什么。如果将timestamp 列设置为nullable,则默认值为NULL,并且允许为null。

      所以:

      $table->timestamp('my_new_timestamp')->nullable();
      

      将给出以下 SQL:

      `my_new_timestamp` timestamp NULL DEFAULT NULL
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我更新了我的问题。我想知道为什么created_atupdated_at 没有CURRENT_TIMESTAMP 作为Defaut
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多