2015-06-15 18 views
9

Używam Laravel 5.1. Żeby było proste, mam następujący kodWymowny model nie aktualizujący sygnatury czasowej updated_at

Migracja:

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

I to jest kod gdzieś indziej Używam

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

Teraz, zgodnie z dokumentacją laravel

Ponownie, znacznik updated_at zostanie automatycznie zaktualizowany, więc nie ma potrzeby ręcznego ustawiania jego wartości

Zaktualizowaną wartość należy zaktualizować w tabeli. Tak się jednak nie dzieje.

Jest ustawiany tylko na pierwszym insercie, ale nie na aktualizacji. Gdy robię to ręcznie, to działa to. Jednak doktorzy twierdzą, że powinno to nastąpić automatycznie, więc co jest nie tak?

Przeszukałem kilka stron na StackOverflow na to pytanie, ale te, które znalazłem, gdzie za laravel 3 lub 4.1, 4.2 itd.

Jak miałbym to zrobić poprawnie?

+5

jeśli nie ma zmian do zapisu danych, to nie będzie aktualizowana ..... to tylko niepotrzebny narzut .... i '$ sitemapData = SitemapData :: firstOrNew ([ 'postUrl' => $ post ]); $ sitemapData-> save(); 'nie zmienia danych rekordów w żaden sposób –

+0

Ah w porządku! Myślałem, że updated_at jest aktualizowany niezależnie od zmian. Masz rację, że nie wprowadziłem zmian, chciałem tylko sprawdzić, czy to działa, czy nie. Dzięki. Teraz to ma sens – Musterknabe

+1

Nie, to tutaj Laravel próbuje być sprytny i unika kosztu wywołania bazy danych, jeśli nie jest to konieczne, –

Odpowiedz

17

Jak wspomniano w komentarzach, jeśli model nie ulegnie zmianie, znaczniki czasu nie będą aktualizowane. Jednak jeśli trzeba je aktualizować, lub chcesz sprawdzić, czy wszystko działa poprawnie korzystania $model->touch() - więcej here

+0

, jak o 'created_at'. Natknąłem się na błąd, w którym 'created_at' został ustawiony na 0, ale' updated_at' był poprawny. Może się zdarzyć, że 'updated_at' zostanie zaktualizowany później. Nie mogę jednak odtworzyć tego problemu. To był tylko przypadkowy przypadek. – Cybersupernova

1

To jest możliwe w rzeczywistości:

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

To będzie poprawnie zapisać updated_at do teraz. Jeśli nie masz pewności, czy któraś z kolumn modelu uległa zmianie, ale chcesz zaktualizować updated_at niezależnie od tego - jest to właściwa droga.

0

Tak co Musterknabe zrobiła jest poprawne, ale powinien również sprawdzić swój model SitemapData.php powinno mieć ustawiony znacznik czasu $ = true;

1 <?php 
2 
3 class SitemapData extends Eloquent { 
4 
5   public $timestamps = true;