【问题标题】:Laravel timestamps() doesn't create CURRENT_TIMESTAMPLaravel timestamps() 不会创建 CURRENT_TIMESTAMP
【发布时间】:2016-04-03 15:01:32
【问题描述】:

我有一个具有timestamps() 方法的迁移,然后我有一个种子来播种此表。

Schema::create('mytable', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->timestamps();
});

种子长这样:

DB::table('mytable')->insert([
    [
        'title' => 'My Awesome Title'
    ]
]);

当它全部运行时:

php artisan migrate:refresh --seed

item被插入了,但是created_atupdated_at的值都是0000-00-00 00:00:00为什么设置不正确?

这是它创建的列方案:

`created_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

我想要这些方案:

`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

【问题讨论】:

  • 使用 Eloquent 模型创建记录,而不是 Fluent 界面,它们应该设置正确。

标签: php laravel eloquent laravel-migrations laravel-seeding


【解决方案1】:

对于以后的版本,你可以简单地使用。 (source)

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();

【讨论】:

  • 你不需要指定 $timestamps = false;有了这个
  • 不,你没有,因为你仍然有时间戳,但只有不同的默认值
【解决方案2】:

当你不使用 Eloquent 插入数据时,你需要自己插入时间戳。

如果你使用:

$x = new MyTable();
$x->title = 'My Awesome Title';
$x->save();

你会正确填写时间戳(当然你需要先创建MyTable模型)

编辑

如果你真的想要,你可以改变:

$table->timestamps();

进入:

$table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(\DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

如果你为这个表创建模型,你应该设置

$timestamps = false;

以确保 Eloquent 不会试图在他的路上设置它们。

EDIT2

还有一个更重要的问题。如果您在 PHP 和 MySQL 中的其他表中混合设置日期,您应该确保在 PHP 和 MySQL 中都有完全相同的日期时间(和时区),或者您应该使用与记录中设置的相同日期比较(MySQL或 PHP)。否则在运行查询时,您可能会得到意想不到的结果,例如

SELECT * FROM mytable WHERE DATE(created_at) = CURDATE()

可能与传递 PHP 日期的运行查询不同

"SELECT * FROM mytable WHERE DATE(created_at) = '".date('Y-m-d")."'"

因为在 PHP 服务器上它可能是例如 2015-12-29 但在 MySQL 服务器上是 2015-12-30

【讨论】:

  • 好的,我确实有(只是注释掉了)。所以必须这样做,我认为 laravel 会这样做。好的,谢谢
  • @GetOffMyLawn 我在 EDIT2 中添加了更多信息
【解决方案3】:

如果我在时间戳中播种并在工厂中设置它,我会使用碳库。 如果没有,你可以这样做:

$timestamps = false;

我会删除$table->timestamps(); 如果我不打算使用它,请从迁移中删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2014-02-16
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多