2011-09-18 110 views
2

我想在使用doctrine模式工具創建的數據庫中保存日期時間。 在我的表單中,我設置了一個日期和時間,我想將它作爲日期時間保存在數據庫中。使用Doctrine 2.1在數據庫中保存Zend日期

所以我想這:

$e->setStartDateTime(new Zend_Date('2011-09-01T22:00:00',Zend_date::DATETIME));

,但我得到的錯誤:

PHP Fatal error: Call to undefined method Zend_Date::format() in /var/www/shared/Doctrine/lib/vendor/doctrine-dbal/lib/Doctrine/DBAL/Types/DateTimeType.php on line 44 

有沒有人有這一點,並能夠幫助我解決這個問題的經驗?

回答

4

Doctrine2期望用於DQL日期和日期時間類型的PHP DateTime對象。

如果沒有被迫使用Zend_Date的運算,這樣的:

->setStartDateTime(new DateTime('2011-09-01T22:00:00')) 

否則,將其轉換爲DateTime:

new DateTime('@' . $zendDate->getTimestamp()) 

DateTime文檔。

+0

你必須使用這樣的反斜槓... new \ DateTime()...來使用全局命名空間。 – PachinSV

+0

僅當您的代碼是命名空間時;) – arnaud576875

5

您可以覆蓋本機數據類型以使用Zend_Date而不是PHP的本機DateTime,它是Doctrine數據類型'datetime','time'和'date'的默認值。

首先在您的應用程序Bootstrap文件中添加以下內容,然後再實例化您的Doctrine EntityManager。此代碼應出現在任何其他學說代碼:

Doctrine\DBAL\Types\Type::overrideType('datetime', 'yournamespace\types\DateTimeType'); 
Doctrine\DBAL\Types\Type::overrideType('date', 'yournamespace\types\DateType'); 
Doctrine\DBAL\Types\Type::overrideType('time', 'yournamespace\types\Time'); 

現在,你只需要執行3班。爲了實現這一點,擴展相應的Doctrine類是最簡單的。代碼對於所有3個類實際上都是相同的,唯一的區別是您所擴展的類和您的類的名稱。這裏是DateTimeType類爲例:

namespace yournamespace\type; 

use Doctrine\DBAL\Types\DateTimeType as DoctrineDateTimeType; 
use Doctrine\DBAL\Platforms\AbstractPlatform; 

/** 
* Override 'datetime' type in Doctrine to use Zend_Date 
*/ 
class DateTimeType extends DoctrineDateTimeType 
{ 

    /** 
    * Convert from db to Zend_Date 
    * 
    * @param string $value 
    * @param AbstractPlatform $platform 
    * @return \Zend_Date|null 
    */ 
    public function convertToPhpValue($value, AbstractPlatform $platform) 
    { 
     if (is_null($value)) { 
      return null; 
     } 
     \Zend_Date::setOptions(array('format_type' => 'php',)); 
     $phpValue = new \Zend_Date($value, $platform->getDateTimeFormatString()); 
     \Zend_Date::setOptions(array('format_type' => 'iso',)); 

     return $phpValue; 
    } 

    /** 
    * Convert from Zend_Date to db 
    * 
    * @param string $value 
    * @param AbstractPlatform $platform 
    * @return string|null 
    */ 
    public function convertToDatabaseValue($value, AbstractPlatform $platform) 
    { 
     if (is_null($value)) { 
      return null; 
     } 
     \Zend_Date::setOptions(array('format_type' => 'php',)); 
     $dbValue = $value->toString($platform->getDateTimeFormatString()); 
     \Zend_Date::setOptions(array('format_type' => 'iso',)); 

     return $dbValue; 
    } 

} 

現在,你仍然可以在教義使用@Column(類型=「日期時間」)註解。保存到數據庫時,可以將類型「datetime」的實體屬性保存爲Zend_Date實例。另外,當從數據庫中抓取實體時,類型「datetime」的屬性現在將成爲Zend_Dates。