2010-05-30 10 views
13

ich folgende yaml Code versucht:Wie definiere ich den aktuellen Zeitstempel in Yaml mit Doktrin?

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

In der ausgegebenen SQL-Anweisung wird das Feld als Datum- und Zeitstempel statt behandelt, die ich nicht den aktuellen Zeitstempel darin definieren ...

Wenn ich darauf bestehen, Zeitstempel zu verwenden, um die aktuelle Zeit zu speichern, wie geht das in Yaml?

Antwort

9

Sie könnten die ‚Timestampable‘ Funktionalität in der Lehre verwendet werden, zB:

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

Beachten Sie, dass DEFAULT CURRENT_TIMESTAMP nicht das gleiche wie Timestampable funktioniert, und daher kann man nicht blind für den anderen auszutauschen.

  • In erster Linie, die ehemalige verwendet das Datum/Uhrzeit des DB-Server, während die letzteren eine Lehre Magie verwendet, die PHP-Funktion date() auf Ihrem Webserver aufruft. Mit anderen Worten, sie sind zwei verschiedene Möglichkeiten, um das Datum/die Zeit aus zwei völlig verschiedenen Taktquellen zu erhalten. Sie können große Probleme haben, wenn Sie Timestampable verwenden, Ihr Webserver auf einem anderen Computer als Ihrem DB-Server ausgeführt wird und Sie Ihre Uhren nicht synchron halten, z. NTP.

  • Auch die DEFAULT CURRENT_TIMESTAMP auf der Tabellendefinition sein, macht für eine viel einheitlichere Datenbankmodell IMHO, wie egal wie Sie die Daten einfügen (zum Beispiel Lauf INSERT s auf dem Motorbefehlszeile DB), werden Sie erhalte immer das aktuelle Datum/die aktuelle Uhrzeit in der Spalte.

BTW, ich bin auch der Suche nach einer Antwort auf die CURRENT_TIMESTAMP Problem in der Anfangsfrage erwähnt, da dies (aufgrund der oben dargelegten Gründen) meine bevorzugte Art und Weise „Zeitstempel“ Spalten zu halten.

+0

Hier ist meine Lösung: http://StackOverflow.com/a/37924640/1668200 –

-12

Sie verwenden können:

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

Wenn Sie bereit sind, einige Portabilität zu opfern (description of columnDefinition attribute sehen) für die Fähigkeit von MySQL automatische Initialisierung TIMESTAMP zu verwenden (siehe MySQL timestamp initialization), dann können Sie die folgenden Befehle verwenden:

Yaml:

created_time: 
    type: datetime 
    columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP 

Annotation:

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

Hallo j0k, danke für Ihre Antwort. Es wurde ein neues Thema erstellt, da ich es nicht mit Ihrer Lösung umsetzen konnte: 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; 

nach Laufe ./vendor/bin/doctrine-module orm:schema-tool:update --force

Aktualisieren von Datenbankschema ... Datenbank-Schema erfolgreich aktualisiert! "1" Anfragen wurden

ausgeführt und ./vendor/bin/doctrine-module orm:validate-schema

[Mapping] OK laufen - Die Mapping-Dateien korrekt sind.[Datenbank] FAIL - Das Datenbankschema stimmt nicht mit der aktuellen Zuordnungsdatei überein.

Aber FAIL für sync

+0

WARNUNG ! Es ist eine gute Antwort, wenn Sie Ihre Datenbank nicht von PHP aktualisieren, aber Struktur mit Migrationen aktualisieren wollen oder so! –

0

Sorry für necroposting erscheinen. Aber ich habe das gleiche Problem gefunden. Es gibt eine Lösung für Doktrin 2 und postgreSql. Ich habe Gemdo Erweiterung verwendet und hinzugefügt folgenden Strings:

$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 

Dump-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

Ich schlage vor, nicht alle "default" für Zeitstempel zu verwenden.

Es bringt unvorhersehbaren Zustand in Yaml in Ihrer Anwendung. Dieses Video (PHP UK Conference 2016 - Marco Pivetta - Doctrine ORM Good Practices and Tricks) bietet weitere Informationen zu diesem Thema. Ich empfehle Ihnen, durchzugehen und einen benannten Konstruktor zu erstellen.

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

Ich schlage vor, staatenlos zu sein, viel Glück!

Verwandte Themen