您可以覆盖本机数据类型以使用 Zend_Date 代替 PHP 的本机 DateTime,后者是 Doctrine 数据类型 'datetime'、'time' 和 'date' 的默认值。
首先在您的应用程序引导文件中,在您实例化 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") 注解。保存到数据库时,您可以将“日期时间”类型的实体属性保存到 Zend_Date 实例。此外,当从数据库中抓取实体时,“日期时间”类型的属性现在将是 Zend_Dates。