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

6pp0gazn  于 2023-01-08  发布在  PHP
关注(0)|答案(5)|浏览(103)

我使用的是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文档中看到了以下内容:
x1米6英寸x1米7英寸

所以根据文档$table->timestamps();不应该允许NULL作为Default。但是我仍然得到created_atupdated_at列,其中NULL作为Default。我很困惑。请帮助!!

实际上,这些列应该像下面的表:

wsxa1bj1

wsxa1bj11#

如果在模式构建器中使用$table->timestamp('created_at')而不是$table-timestamps(),则默认值将是CURRENT_TIMESTAMP,而不是NULL
存储记录的更新时间同样:$table->timestamp('updated_at').
区别仅在于一个字母**'s '**,并且必须提及列名,例如created_at/createdupdated_at/updated

vuktfyat

vuktfyat2#

只是提醒一下,因为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上找到。
泰勒·奥特韦尔:我个人认为-〉timestamps()应该默认为-〉nullableTimestamps()来解决这个问题。
摘自Github期刊https://github.com/laravel/framework/issues/12060#issuecomment-179249086
提交中的更改:使时间戳默认为空https://github.com/laravel/framework/commit/720a116897a4cc6780fa22f34d30c5986eafc581

ma8fv8wu

ma8fv8wu3#

不知道这是否回答了问题,但...
默认的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
jpfvwuh4

jpfvwuh44#

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

niwlg2el

niwlg2el5#

自Laravel 5.5起:

$table->timestamp('returned_at')->useCurrent();

使用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

相关问题