Eloquent模型不更新updated_at时间戳

时间:2015-06-15 12:07:01

标签: php laravel timestamp eloquent

我正在使用Laravel 5.1。为简单起见,我有以下代码

迁移:

Schema::create('sitemap_data', function (Blueprint $table) {
    // Primary and foreign keys
    $table->increments('id');
    $table->string('postUrl');
    // Database functions
    $table->timestamps();
});

这是我正在使用的其他地方的代码

$sitemapData = SitemapData::firstOrNew([
                'postUrl' => $post
            ]);
$sitemapData->save();

现在,根据Laravel文档

  

同样,updated_at时间戳会自动更新,因此无需手动设置其值

应在表格中更新updated_at值。但是,这种情况并没有发生。

它只在第一次插入时设置,但不在更新时设置。当我手动完成时,像这样

$sitemapData = SitemapData::firstOrNew([
                    'postUrl' => $post
                ]);
$sitemapData->updated_at = Carbon::now();
$sitemapData->save();

它有效。但是,文档说这应该自动发生,所以这里有什么问题?

我在stackoverflow上搜索了一些关于这个问题的网站,但是我找到了Laravel 3或4.1,4.2等的网站。

我该如何正确地做到这一点?

5 个答案:

答案 0 :(得分:29)

如评论中所述,如果模型没有更改,则时间戳不会更新。但是,如果您需要更新它们,或者想要检查一切是否正常,请使用$model->touch() - 更多here

答案 1 :(得分:3)

问题不是这种情况,但是如果您使用查询生成器而不是Eloquent模型,则会发生相同的问题。

如果愿意

DB::table('users')->where()->update()

代替

User::where()->update()

updated_at不会被更新。

答案 2 :(得分:1)

实际上可能是:

$model->updated_at = Carbon::now();
$model->save(['timestamps' => FALSE]);

这样可以将updated_at正确保存到现在。如果您不确定某个模型的列是否已更改,但您确实想要更新updated_at - 这是可行的方法。

答案 3 :(得分:1)

是的 Musterknabe 所做的是正确的,但他也应检查他的模型 SitemapData.php 它应该设置$timestamps = true;

<?php 

 class SitemapData extends Eloquent {

        public $timestamps = true;
}

答案 4 :(得分:0)

转到 phpmyadmin 并选择您的数据库并选择表 点按上面的 SQL 选项卡并输入例如这样的内容:

UPDATE `boshogriq_table` SET  `updated_at`= DATE_ADD(`created_at`, INTERVAL 1 MINUTE)
 WHERE  `updated_at` > DATE_ADD(`created_at`, INTERVAL 10 MINUTE)

通过 go 按钮运行它。 Laravel 不允许你这样做