2015-06-15 11 views
9

Sto usando Laravel 5.1. Per rendere più semplice, ho il seguente codiceModello Eloquent che non aggiorna aggiornato_at timestamp

Migrazione:

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

E questo è il codice da qualche altra parte che sto utilizzando

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

Ora, in base alla documentazione laravel

Anche in questo caso, il timestamp aggiornato_at verrà automaticamente aggiornato, quindi non è necessario impostare manualmente il suo valore

Il valore updated_at deve essere aggiornato nella tabella. Tuttavia, questo non sta accadendo.

Viene impostato solo sul primo inserto, ma non sull'aggiornamento. Quando lo faccio manualmente, come questo

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

funziona. Tuttavia, i documenti dicono che questo dovrebbe accadere automaticamente, quindi cosa c'è di sbagliato qui?

Ho cercato alcuni siti su StackOverflow a questa domanda, ma quelli che ho trovato dove per laravel 3 o 4.1, 4.2 ecc

Come dovrei farlo correttamente?

+5

Se non ci sono modifiche ai dati record, allora non sarà aggiornato ..... questo è solo un inutile sovraccarico .... e '$ sitemapData = SitemapData :: firstOrNew ([ 'posturl' => $ post ]); $ sitemapData-> save(); 'non modifica in alcun modo i dati del record –

+0

Ah okay! Pensavo che update_at venga aggiornato indipendentemente dalle modifiche o meno. Hai ragione, che non ho apportato modifiche, volevo solo verificare se funziona o meno. Grazie. Ora questo ha senso – Musterknabe

+1

No, è qui che Laravel sta cercando di essere intelligente ed evita le spese di una chiamata al database se non è necessario –

risposta

17

Come menzionato nei commenti, se il modello non ha modificato i timestamp non verrà aggiornato. Tuttavia, se è necessario aggiornare loro, o voler controllare se tutto funziona bene l'uso $model->touch() - più here

+0

come su 'created_at'. Mi sono imbattuto in un errore in cui 'created_at' era impostato su 0 ma 'updated_at' era corretto. Potrebbe essere possibile che 'updated_at' sia stato aggiornato più tardi. Tuttavia non sono in grado di rigenerare questo problema. Era solo un caso casuale. – Cybersupernova

1

E 'possibile in realtà:

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

Che vi correttamente salvare il updated_at ad oggi. Se non sei sicuro se una delle colonne del modello è cambiata, ma vuoi aggiornare lo updated_at a prescindere - questa è la strada da percorrere.

0

Sì quello Musterknabe ha fatto è corretto ma dovrebbe anche controllare il suo modello SitemapData.php si dovrebbe avere impostare $ timestamp = true;

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