2012-05-31 1 views
22

Ho un campo denominato "compleanno" nell'entità dottrina.Come impostare una data in Doctrine 2?

Vorrei creare un oggetto da aggiungere al database usando doctrine.

all'interno del controller:

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

ma quando provo a persistere ottengo questo errore

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 

Edit:

mia entità:

/** 
* @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

Potrebbe noi il tuo entità ad essa correlata Student mostrare? E hai controllato [questa risposta] (http://stackoverflow.com/questions/7463137/saving-a-zend-date-in-the-database-with-doctrine-2-1)? – j0k

+0

http://pastebin.com/8D7tdSef (non riesco a modificare il thread) –

+0

Hai controllato [questa risposta] (http://stackoverflow.com/questions/7463137/saving-a-zend-date-in- the-database-with-doctrine-2-1)? - su DateTime – j0k

risposta

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

geniale, quello era il mio problema nel tentativo di impostare manualmente alcuni tipi di datetime in mysql db. – blamb

25

campi delle vostre entità mappati come "datetime" o "date" dovrebbe contenere le istanze di DateTime.

Pertanto, il setter dovrebbe essere di tipo accennato come segue:

/** 
* 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; 
} 

Questo consente di impostare sia null o un'istanza di DateTime per il compleanno.

Come si nota, ho anche clone i valori per la data di compleanno per evitare di rompere incapsulamento (vedi Doctrine2 ORM does not save changes to a DateTime field).

Per impostare il compleanno, allora semplicemente non seguente:

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

'php app/console doctrine: generate: entities' ha generato solo il seguente header di metodo' * @param \ DateTime $ birthdate, * @return Person, public setBirthdate ($ birthdate) '. Quando adotto l'intestazione del metodo in 'public setBirthdate (\ DateTime $ birthdate = NULL)' Ottengo 'Argomento 1 passato a <...> :: setBirthdate() deve essere un'istanza di DateTime, stringa fornita'. Ma la stringa è vuota (perché il campo modulo non è riempito). – rabudde

+0

@rabudde non dovresti generare le tue entità. Le entità fanno parte della tua base di codice e sono un componente fondamentale del tuo dominio. Generalmente il codice generato è una cattiva idea poiché si evita di testarlo dopo averlo generato. Inoltre, sembra che il tuo modulo non stia convertendo un valore vuoto in un valore 'null'. – Ocramius