web-dev-qa-db-ja.com

Eloquentモデルがupdated_atタイムスタンプを更新しない

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などです。

どうすれば正しくできますか?

17
Musterknabe

コメントで述べたように、モデルが変更されなかった場合、タイムスタンプは更新されません。ただし、それらを更新する必要がある場合、またはすべてが正常に機能しているかどうかを確認する場合は、$model->touch()-more here を使用してください。

36
Pawel Bieszczad

ええMusterknabeが行ったことは正しいですが、モデルもチェックする必要がありますSitemapData.php _$timestamps = true;_

_<?php 

 class SitemapData extends Eloquent {

        public $timestamps = true;
}
_
5
Saeed

実際に可能です:

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

これでupdated_atが正しく保存されます。モデルの列のいずれかが変更されたかどうかは不明ですが、updated_atを更新する必要がある場合-これが方法です。

2
Stan Smulders