2014-06-25 10 views
23

Posso mappare timestamp di laravel da:Cambiare il nome di created_at del laravel e updated_at

created_at a post_date e post_date_gmt?

updated_at a post_modified e post_modified_gmt?


Sto migrando un'applicazione di Wordpress a Laravel.

Sto accedendo a una copia del database Wordpress utilizzando Laravel. La versione live del database è ancora in uso, quindi non voglio cambiare lo schema.

La tabella di messaggi ha post_date, post_date_gmt, post_modified e post_modified_gmt, ma laravel si aspetta created_at e updated_at.

Esiste comunque la possibilità di modificare i nomi delle colonne cercati da Laravel?

Vorrei che Laravel aggiorni i timestamp di tutte le colonne che sono già presenti.

risposta

40

La risposta accettata potrebbe causare problemi con l'aggiornamento dei timestamp, sfortunatamente.

Faresti meglio a const di override del modello:

const CREATED_AT = 'post_date'; 
const UPDATED_AT = 'post_modified'; 

poi metodi getCreatedAtColumn e getUpdatedAtColumn torneranno post_date e post_modified rispettivamente, ma non fare alcun danno.

Per le altre colonne è necessario utilizzare eventi come suggerito da @Oni.

+0

Puoi spiegare come la risposta accettata può causare problemi? Sono incuriosito. – alexrussell

+0

La classe del modello Eloquent si riferisce a 'static :: CREATED_AT' e' static :: UPDATED_AT' in alcuni metodi, anche in quel particolare 2 che @Oni sovrascrive. Pertanto, le colonne con questi metodi renderebbero Eloquent la ricerca di 'created_at' e' updated_at' quando si aggiornano i timestamp (ad esempio, il metodo 'updateTimestamps'). Lo stesso vale per 'DELETED_AT' quando vengono utilizzate le eliminazioni software. –

+0

Hmm che sembra un possibile bug in Laravel (nel senso che dovrebbe usare i metodi non le costanti), giusto? – alexrussell

19

Se si guarda nella fonte del Eloquent classe

https://github.com/illuminate/database/blob/4.2/Eloquent/Model.php#L223-L235

Dovreste essere in grado di modificare questi nomi di colonna abbastanza facilmente sovrascrivendo queste costanti.

<?php 

class YourModel extends Eloquent { 

    /** 
    * The name of the "created at" column. 
    * 
    * @var string 
    */ 
    const CREATED_AT = 'post_date'; 

    /** 
    * The name of the "updated at" column. 
    * 
    * @var string 
    */ 
    const UPDATED_AT = 'post_modified'; 

} 

quanto riguarda la versione _gmt di quei timestamp, si potrebbe voler esaminare events. Qui è un buon inizio

http://driesvints.com/blog/using-laravel-4-model-events

+0

Controllare la mia risposta in quanto ciò porterà a comportamenti imprevisti. –

+0

Ho esaminato di nuovo la sorgente ed è come quello che deczo ha detto, il codice che fornisco si tradurrà in errore quando si tratta di altri metodi che utilizzano le costanti statiche. Ho aggiornato l'esempio di codice per riflettere il suggerimento di deczo. – Oni

0

Si potrebbe provare a utilizzare i getter attributi e getter:

class Post extends Eloquent 
{ 
    public function getCreatedAtAttribute() 
    { 
     return $this->attributes['post_date']; 
    } 

    public function setCreatedAtAttribute($value) 
    { 
     $this->attributes['post_date'] = $value; 

     // this may not work, depends if it's a Carbon instance, and may also break the above - you may have to clone the instance 
     $this->attributes['post_date_gmt'] = $value->setTimezone('UTC'); 
    } 
} 

Non so se questo funzionerà, ma si potrebbe dare un andare. Sicuramente una base su cui andare forse - dovrai giocarci.

+0

Oh ignora questo, Oni è molto meglio! – alexrussell

Problemi correlati