2

我想在使用教义模式工具创建的数据库中保存一个日期时间。在我的表单中,我设置了一个日期和时间,我想将它作为日期时间保存在数据库中。

所以我尝试了这个:

$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

3 回答 3

5

您可以覆盖本机数据类型以使用 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。

于 2011-11-04T16:17:31.837 回答
4

Doctrine2 需要 DQL 日期和日期时间类型的 PHP DateTime 对象。

如果你不是被迫使用 Zend_Date,那么:

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

否则,将其转换为 DateTime:

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

请参阅DateTime文档。

于 2011-09-18T17:30:51.670 回答
3

您可以实现自定义映射类型或使用此ZendDateType实现。

您可能会发现本指南很有帮助。

于 2011-09-19T07:53:30.937 回答