【问题标题】:Timestamps (updated_at, created_at) are null in Laravel 5Laravel 5 中的时间戳 (updated_at, created_at) 为空
【发布时间】: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',
]);

谢谢。

【问题讨论】:

  • 请告诉我们如何插入数据。

标签: laravel laravel-5 laravel-5.2


【解决方案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 自动完成)

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

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 2019-01-22
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多