Eloquent模型不更新updated_at时间戳

Mus*_*abe 15 php timestamp laravel 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();
});
Run Code Online (Sandbox Code Playgroud)

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

$sitemapData = SitemapData::firstOrNew([
                'postUrl' => $post
            ]);
$sitemapData->save();
Run Code Online (Sandbox Code Playgroud)

现在,根据Laravel文档

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

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

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

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

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

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

我该怎么做呢?

Paw*_*zad 33

如评论中所述,如果模型没有更改,则时间戳不会更新.但是,如果您需要更新它们,或者想要检查一切是否正常工作$model->touch()- 更多信息请点击此处


rea*_*lay 7

问题中的情况并非如此,但如果您使用查询生成器而不是雄辩模型,则会发生同样的问题。

如果你这样做

DB::table('users')->where()->update()
Run Code Online (Sandbox Code Playgroud)

代替

User::where()->update()
Run Code Online (Sandbox Code Playgroud)

Updated_at 将不会更新。


Sta*_*ers 6

实际上是可能的:

$model->updated_at = Carbon::now();
$model->save(['timestamps' => FALSE]);
Run Code Online (Sandbox Code Playgroud)

这将正确保存updated_at到现在。如果您不确定模型的任何列是否已更改,但您确实想更新updated_at无论如何 - 这就是要走的路。


小智 5

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

<?php 

 class SitemapData extends Eloquent {

        public $timestamps = true;
}
Run Code Online (Sandbox Code Playgroud)