2010-05-30 8 views
13

He probado el siguiente código yaml:¿Cómo se define la marca de tiempo actual en yaml con doctrina?

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

en la instrucción SQL emitida, el campo se trata como fecha y hora en lugar de marca de tiempo, que no puedo definir la fecha y hora actual en ella ...

Si yo insiste en usar la marca de tiempo para almacenar la hora actual, ¿cómo hacerlo en yaml?

Respuesta

9

podría utilizar la funcionalidad 'Timestampable' en la doctrina, por ejemplo:

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

en cuenta que DEFAULT CURRENT_TIMESTAMP no funciona lo mismo que Timestampable, y por lo tanto no se puede intercambiar ciegamente uno para el otro.

  • En primer lugar, el primero utiliza la fecha/hora del servidor de base de datos, mientras que el segundo utiliza una magia Doctrina que llama a la función de PHP date() en su servidor web. En otras palabras, son dos maneras distintas de obtener la fecha/hora, a partir de dos fuentes de reloj completamente diferentes. Puede tener grandes problemas si usa Timestampable, su servidor web se ejecuta en una máquina diferente a su servidor de base de datos y no mantiene sus relojes sincronizados usando, por ejemplo, NTP.

  • Además, el DEFAULT CURRENT_TIMESTAMP estar en la definición de la tabla hace que para un modelo de base de datos en mi humilde opinión mucho más consistente, ya que no importa cómo insertar los datos (por ejemplo, correr INSERT s en la línea de comandos del motor DB), se le siempre obtenga la fecha/hora actual en la columna.

Por cierto, yo también estoy buscando una respuesta al problema CURRENT_TIMESTAMP mencionado en la pregunta inicial, ya que esto es (debido a las razones expuestas anteriormente) mi forma preferida de mantener "columnas de fecha y hora".

+0

Aquí está mi solución: http://stackoverflow.com/a/37924640/1668200 –

-12

Se puede utilizar:

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

Si usted está dispuesto a sacrificar algo de portabilidad (ver description of columnDefinition attribute) para la capacidad de utilizar TIMESTAMP inicialización automática de MySQL (ver MySQL timestamp initialization), entonces se puede utilizar lo siguiente:

Yaml:

created_time: 
    type: datetime 
    columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP 

Anotación:

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

Hola j0k, gracias por tu respuesta. Hice un nuevo tema porque no pude hacer que funcione con su solución: 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; 

Después de Ejecutar ./vendor/bin/doctrine-module orm:schema-tool:update --force

Actualizando ... esquema de base de datos actualizada correctamente! "1" consultas fueron ejecutados

y corren ./vendor/bin/doctrine-module orm:validate-schema

[Mapeo] OK - Los archivos de asignación son correctos.[Base de datos] FAIL - El esquema de la base de datos no está sincronizado con el archivo de mapeo actual.

Pero FALL de sincronización aparecen

+0

ADVERTENCIA ! es una buena respuesta, cuando no actualice su base de datos desde PHP, ¡pero sí quiere actualizar la estructura con migraciones más o menos! –

0

Lo siento por necroposting. Pero he encontrado el mismo problema. Hay una solución para la doctrina 2 y postgreSql. He utilizado la extensión Gemdo y ha añadido siguientes cadenas:

$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 

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

sugiero no utilizar "default" de marca de tiempo en absoluto.

Traerá un estado impredecible en yaml en su aplicación. Este video (PHP UK Conference 2016 - Marco Pivetta - Doctrine ORM Good Practices and Tricks) brinda más información sobre este tema. Te sugiero que lo revises y crees un constructor con nombre.

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

¡Sugiero ser apátrida, buena suerte!

Cuestiones relacionadas