2012-05-31 6 views
22

Ich habe ein Feld namens "Geburtstag" in Lehre Entität.Wie setze ich ein Datum in Doctrine 2?

Ich möchte ein Objekt erstellen, um die Datenbank mit Doktrin hinzufügen.

Innerhalb der Steuerung:

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

aber wenn ich versuche ich diesen Fehler zu beharren

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:

Meine Einheit:

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

Können Sie uns zeigen Sie Ihre Einheit Studenten zu tun? Und hast du [diese Antwort] überprüft (http://stackoverflow.com/questions/7463137/saving-a-zend-date-in-the-database-with-doctrine-2-1)? – j0k

+0

http://pastebin.com/8D7tdSef (Ich kann den Thread nicht bearbeiten) –

+0

Haben Sie [diese Antwort] überprüft (http://stackoverflow.com/questions/7463137/saving-a-zend-date-in- die Datenbank-mit-Doktrin-2-1)? - über DateTime – j0k

Antwort

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

brilliant, das war mein Problem beim manuellen Setzen einiger Datetime-Typen in mysql db. – blamb

25

Felder Ihrer Einheiten abgebildet, wie "datetime" oder "date" Instanzen DateTime enthalten sollte.

Daher Ihre Setter sollten folgende typangedeutet sein:

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

Dies ermöglicht Einstellung entweder null oder eine Instanz von DateTime für den Geburtstag.

Wie Sie bemerken, habe ich auch clone die Werte für das Geburtstagsdatum, um kaputte Einkapselung zu vermeiden (siehe Doctrine2 ORM does not save changes to a DateTime field).

den Geburtstag zu setzen, Sie dann gehen Sie wie folgt einfach:

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

'php app/console doctrine: generate: entities' generierte nur die folgende Methode header' * @param \ DateTime $ Geburtsdatum, * @return Person, öffentliche Funktion setBirthdate ($ birthdate) '. Wenn ich den Methodenkopf auf 'public function setBirthdate (\ DateTime $ birthdate = NULL) anwende' 'bekomme ich' Argument 1 an <...> übergeben :: setBirthdate() muss eine Instanz von DateTime sein, String gegeben '. Die Zeichenfolge ist jedoch leer (weil das Formularfeld nicht ausgefüllt ist). – rabudde

+0

@rabudde sollten Sie Ihre Entitäten nicht generieren. Entitäten sind Teil Ihrer Codebasis und eine Kernkomponente Ihrer Domäne. Generierter Code ist normalerweise eine schlechte Idee, da Sie ihn nach dem Generieren nicht testen. Außerdem sieht es so aus, als würde Ihr Formular keinen leeren Wert in einen Nullwert umwandeln. – Ocramius

Verwandte Themen