2012-05-31 113 views
22

我在學說實體中有一個名爲「生日」的字段。如何在Doctrine 2中設置日期?

我想創建一個對象來添加到數據庫使用原則。

控制器內部:

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

但是當我試圖堅持我得到這個錯誤

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 

編輯:

我的實體:

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

你能告訴我們你的有關學生的實體?你有沒有檢查[這個答案](http://stackoverflow.com/questions/7463137/saving-a-zend-date-in-the-database-with-doctrine-2-1)? – j0k

+0

http://pastebin.com/8D7tdSef(我無法編輯線程) –

+0

您是否檢查[此答案](http://stackoverflow.com/questions/7463137/saving-a-zend-date-in- the-database-with-doctrine-2-1)? - 關於DateTime – j0k

回答

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

輝煌,那是我的問題,試圖手動設置一些日期時間類型在MySQL數據庫。 – blamb

25

您實體字段映射爲"datetime""date"應包含DateTime實例。

因此,你的二傳手應該是類型暗示如下:

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

這允許設置任何null或生日的的DateTime實例。如您注意,我也clone生日的值,以避免破壞封裝(見Doctrine2 ORM does not save changes to a DateTime field)。

要設置的生日,你後來乾脆以下:

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

'php app/console doctrine:generate:entities'只生成下面的方法頭文件* @param \ DateTime $ birthdate,* @return Person,公共函數setBirthdate($ birthdate)'。當我將方法頭部接收到'public function setBirthdate(\ DateTime $ birthdate = NULL)時''我得到了'參數1傳遞給<...> :: setBirthdate()必須是DateTime的實例,string given'。但字符串是空的(因爲表單字段沒有填充)。 – rabudde

+0

@rabudde你不應該生成你的實體。實體是您的代碼庫的一部分,並且是您的域的核心組件。生成的代碼通常是一個糟糕的主意,因爲您在生成代碼後避免對其進行測試。另外,它看起來像你的表單不是將空值轉換爲空值。 – Ocramius

相關問題