Doctrine データ型「datetime」、「time」、および「date」のデフォルトである PHP のネイティブ DateTime の代わりに Zend_Date を使用するようにネイティブ データ型をオーバーライドできます。
最初にアプリケーションの Bootstrap ファイルに、Doctrine EntityManager をインスタンス化する前に以下を追加します。このコードは、他のどの Doctrine コードよりも前に置く必要があります:
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;
}
}
Doctrine で @Column(type="datetime") アノテーションを使用できるようになりました。データベースに保存する場合、"datetime" 型のエンティティ プロパティを Zend_Date インスタンスに保存できます。また、データベースからエンティティを取得する場合、"datetime" 型のプロパティは Zend_Dates になります。