2010-05-30 6 views
13

Ho provato il seguente codice yaml:Come definire la data/ora corrente in yaml con la dottrina?

columns: 
    created_time: 
    type: timestamp 
    notnull: true 
    default: default CURRENT_TIMESTAMP 

nell'istruzione SQL in uscita, il campo viene trattato come datetime invece di timestamp, che non riesco a definire il timestamp corrente in esso ...

Se io insistere per utilizzare il timestamp per memorizzare l'ora corrente, come farlo in yaml?

risposta

9

è possibile utilizzare la funzionalità 'Timestampable' nella dottrina, ad esempio:

actAs: 
    Timestampable: 
    created: 
     name: created_time 
    updated: 
     disabled: true 
columns: 
    created_time: 
    type: timestamp 
    notnull: true 
13

noti che DEFAULT CURRENT_TIMESTAMP non funziona lo stesso di Timestampable, e quindi non si può scambiare ciecamente uno per l'altro.

  • In primo luogo, il primo utilizza la data/ora del server DB, mentre il secondo utilizza una magia dottrina che chiama la funzione PHP data() sul vostro server web. In altre parole, sono due modi distinti per ottenere data/ora, da due sorgenti di clock completamente diverse. Potresti avere grossi problemi se usi Timestampable, il tuo server web viene eseguito su una macchina diversa dal tuo server DB e non tieni i tuoi orologi sincronizzati usando, ad es. NTP.

  • Inoltre, il DEFAULT CURRENT_TIMESTAMP essendo sulla definizione della tabella fa per un modello di database molto più coerente IMHO, come non importa come si inseriscono i dati (per esempio, in esecuzione INSERT s nella riga di comando del motore DB), ti sempre ottenere la data/ora corrente sulla colonna.

BTW, sto anche cercando una risposta alla CURRENT_TIMESTAMP problema menzionato nella domanda iniziale, in quanto questo è (per i motivi di cui sopra) il mio modo preferito di mantenere colonne "timestamp".

+0

Ecco la mia soluzione: http://stackoverflow.com/a/37924640/1668200 –

-12

È possibile utilizzare:

default: '<?php echo date('Y-m-d H:i:s') ?>' 
16

Se siete disposti a sacrificare un po 'di portabilità (vedi description of columnDefinition attribute) per la capacità di utilizzare TIMESTAMP inizializzazione automatica di MySQL (vedi MySQL timestamp initialization), quindi è possibile utilizzare il seguente:

Yaml:

created_time: 
    type: datetime 
    columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP 

della nota:

schema di database
@ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") 
+0

Ciao j0k, grazie per la risposta. Creato un nuovo argomento poiché non riuscivo a farlo funzionare con la soluzione: http://stackoverflow.com/questions/17208388/symfony-1-4-doctrine-1-yalm-cannot-define-default-timestamp-value – xtrm

0
/** 
* @var int 
* @ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") 
*/ 
protected $created; 

dopo l'esecuzione ./vendor/bin/doctrine-module orm:schema-tool:update --force

Aggiornamento ... schema di database aggiornato con successo! "1" query sono state eseguite

e corrono ./vendor/bin/doctrine-module orm:validate-schema

OK [Mappatura] - I file di mapping siano corretti.[Database] FAIL - Lo schema del database non è sincronizzato con il file di mappatura corrente.

Ma FAIL per la sincronizzazione appaiono

+0

WARNING ! è una buona risposta, quando non aggiorni il tuo database da PHP, ma vuoi una struttura di aggiornamento con le migrazioni o così! –

0

Ci scusiamo per necroposting. Ma ho incontrato lo stesso problema. C'è una soluzione per doctrine 2 e postgreSql. Ho usato l'estensione Gemdo e ha aggiunto seguenti stringhe:

$evm = new \Doctrine\Common\EventManager(); 

     $timestampableListener = new \Gedmo\Timestampable\TimestampableListener; 
     $timestampableListener->setAnnotationReader($cachedAnnotationReader); 
     $evm->addEventSubscriber($timestampableListener); 

YAML:

created: 
    type: date 
    options: 
     default: 0 
     nullable: true 
    gedmo: 
     timestampable: 
      on: create 
updated: 
    type: datetime 
    options: 
     default: 0 
     nullable: true 
    gedmo: 
     timestampable: 
      on: update 

discarica-sql:

ALTER TABLE users ADD created DATE DEFAULT CURRENT_DATE NOT NULL; 
ALTER TABLE users ADD updated TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL; 
1

suggerisco di non usare "default" per timestamp affatto.

Porterà uno stato imprevisto in yaml nella vostra applicazione. Questo video (PHP UK Conference 2016 - Marco Pivetta - Doctrine ORM Good Practices and Tricks) fornisce ulteriori informazioni su questo argomento. Ti suggerisco di attraversarlo e creare un costruttore nominato.

public function createTimestamp(string $priority, int $priorityNormalized) 
{ 
    $this->priority = $priority; 
    $this->priorityNormalized = $priorityNormalized; 
} 

Suggerisco di essere apolide, buona fortuna!