2012-05-31 24 views
22

Tengo un campo llamado "cumpleaños" en entidad de doctrina.¿Cómo establecer una fecha en Doctrine 2?

Me gustaría crear un objeto para agregar a la base de datos usando doctrine.

dentro del controlador:

$name = "John Alex"; 
$birthday = "11-11-90"; 
$student = new Student(); 
$student->setName($name); 
$student->setBirthday(strtotime($birthday); 
... 

pero cuando intento de persistir consigo este error

Fatal error: Call to a member function format() on a non-object in /Library/WebServer/Documents/Symfony/vendor/doctrine-dbal/lib/Doctrine/DBAL/Types/DateType.php on line 44 

Editar:

Mi entidad:

/** 
* @var string $name 
* 
* @ORM\Column(name="name", type="string", length=255) 
*/ 
private $name; 

/** 
* @var date $birthday 
* 
* @ORM\Column(name="birthday", type="date", nullable=true) 
*/ 
private $birthday; 

/** 
* Set birthday 
* 
* @param date $birthday 
*/ 
public function setBirthday($birthday) 
{ 
    $this->birthday = $birthday; 
} 

/** 
* Get birthday 
* 
* @return date 
*/ 
public function getBirthday() 
{ 
    return $this->birthday; 
} 
+0

Podría nosotros su entidad relacionada con el estudiante mostrar? ¿Y revisó [esta respuesta] (http://stackoverflow.com/questions/7463137/saving-a-zend-date-in-the-database-with-doctrine-2-1)? – j0k

+0

http://pastebin.com/8D7tdSef (no puedo editar el hilo) –

+0

¿Ha marcado [esta respuesta] (http://stackoverflow.com/questions/7463137/saving-a-zend-date-in- the-database-with-doctrine-2-1)? - sobre DateTime – j0k

Respuesta

35
$name = "John Alex"; 
$birthday = "11-11-1990"; // I changed this 
$student = new Student(); 
$student->setName($name); 
$student->setBirthday(new \DateTime($birthday)); // setting a new date instance 
// ... 
+0

brillante, ese fue mi problema al intentar configurar manualmente algunos tipos de fecha y hora en mysql db. – blamb

25

campos de sus entidades asignada como "datetime" o "date" debe contener instancias de DateTime.

Por lo tanto, el colocador debe ser de tipo dado a entender de la siguiente manera:

/** 
* Set birthday 
* 
* @param \DateTime|null $birthday 
*/ 
public function setBirthday(\DateTime $birthday = null) 
{ 
    $this->birthday = $birthday ? clone $birthday : null; 
} 

/** 
* Get birthday 
* 
* @return \DateTime|null 
*/ 
public function getBirthday() 
{ 
    return $this->birthday ? clone $this->birthday : null; 
} 

Esto permite un ajuste, ya sea null o una instancia de DateTime para el cumpleaños.

Como nota, también clone los valores de la fecha de cumpleaños para evitar romper la encapsulación (ver Doctrine2 ORM does not save changes to a DateTime field).

Para establecer el cumpleaños, a continuación, simplemente hace el siguiente:

$student->setBirthday(new \DateTime('11-11-90')); 
+0

'php app/console doctrine: generate: entities' generó solo el siguiente encabezado de método' * @param \ DateTime $ birthdate, * @return Person, public function setBirthdate ($ birthdate) '. Cuando adopto el encabezado de método para 'public function setBirthdate (\ DateTime $ birthdate = NULL)' obtengo 'El argumento 1 pasado a <...> :: setBirthdate() debe ser una instancia de DateTime, string given'. Pero la cadena está vacía (porque el campo de formulario no está lleno). – rabudde

+0

@rabudde no deberías generar tus entidades. Las entidades son parte de su base de código y son un componente central de su dominio. El código generado generalmente es una mala idea, ya que evitas probarlo después de generarlo. Además, parece que su formulario no está convirtiendo un valor vacío en un valor 'nulo'. – Ocramius