Laravel 5 中的时间戳 (updated_at, created_at) 为空

Posted

技术标签:

【中文标题】Laravel 5 中的时间戳 (updated_at, created_at) 为空【英文标题】:Timestamps (updated_at, created_at) are null in Laravel 5 【发布时间】:2016-08-28 03:36:11 【问题描述】:

我对 Laravel 5 中的 updated_atcreated_at 字段有疑问。

这是我的迁移:

Schema::create('lots', function (Blueprint $table) 
    $table->increments('id');
    $table->integer('lot');
    $table->integer('is_active');
    $table->timestamps();
);

但是当我在这个表中插入一些数据时,updated_atcreated_at 字段为空。如何使它们使用当前时间戳自动完成?

我这样插入数据:

\DB::table('admin_lots')->insert([
    'lot' => $request->cycle_lot,
    'is_active' => '1',
]);

谢谢。

【问题讨论】:

请告诉我们如何插入数据。 【参考方案1】:

你可能在插入数据时不使用 Eloquent,在这种情况下你应该手动添加时间戳。

如果您不想这样做,但仍需要填充时间戳,use this hack:

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

更新

根据您更新的代码,这是另一个解决方案:

\DB::table('admin_lots')->insert([
                'lot'   => $request->cycle_lot,
                'is_active'     => '1',
                'created_at' = \Carbon\Carbon::now()->toDateTimeString(),
                'updated_at' = \Carbon\Carbon::now()->toDateTimeString()
            ]);

【讨论】:

更新了我如何插入数据的帖子。谢谢你的回答,马上试试。 添加了另一种基于您的代码手动创建时间戳的解决方案。 老实说,这似乎是 eloquent 的一个用例。在这种情况下,直接插入数据库是一种不好的做法。 谢谢!两种解决方案都对我有用,但第一个更好。非常感谢! 是的。但这种 hack 肯定会让其他人头疼。【参考方案2】:

你必须在 laravel 中使用 create 方法而不是 insert 方法。 Create 方法自动为 created_at 和 updated_at 字段添加时间戳。 User::create(array('name' => 'John'));

【讨论】:

完美,我使用的是insert 而不是create 方法。 在这种情况下,我使用 insert(),因为多次插入.. 我必须做什么?【参考方案3】:

检查你的模型是否有这条线。

public $timestamps = false;

如果有,删除它。

【讨论】:

如果该行在父类中,则必须添加:public $timestamps = true;【参考方案4】:

当你直接插入数据时,Laravel 不会知道你的时间戳。 您可以在插入语句中手动设置时间戳,或者切换到使用 Eloquent 模型,它可以为您处理许多开箱即用的事情,包括时间戳。在适用的情况下,它也比直接查询更容易维护。

Eloquent ORM

【讨论】:

我真的推荐在这种情况下使用 Eloquent。其他任何事情都会导致不必要的难以维护的非 laravel 方式代码。【参考方案5】:

你需要使用 Laravel 很棒的 Eloquent 功能来自动将时间戳写入数据库...

通过查看您的示例,雄辩的代码将如下所示:

$lot_inputs = array(
    'lot' => $request->cycle_lot,
    'is_active' => 1
);
$new_lot = Lot::create($lot_inputs);

请注意,您应该拥有 table = 'lots' 的模型(并且它必须扩展 Eloquent),以便您可以轻松使用 Eloquent 方法及其属性...

如果您尽可能多地使用Eloquent ORM,那就太好了,这样如果您将来想要更改您的数据库技术,那么您就不需要再次指定书面的雄辩查询(例如:将查询转换为不同的数据库语言由 Eloquent 自动完成)

谢谢,希望这能帮助您解决问题..!!

【讨论】:

以上是关于Laravel 5 中的时间戳 (updated_at, created_at) 为空的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 合并 created_at 和 updated_at 时间戳

如何更新 Laravel Eloquent 管理的时间戳(created_at 和 updated_at)的时区?

Laravel 数据透视表时间戳

created_at 列中的时间不正确 - Laravel 5.4

禁用 Laravel 的 Eloquent 时间戳

Laravel 的时间戳有奇怪的返回格式