首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Doctrine 2.1在数据库中保存Zend日期

使用Doctrine 2.1在数据库中保存Zend日期
EN

Stack Overflow用户
提问于 2011-09-19 01:25:30
回答 3查看 3K关注 0票数 2

我想在数据库中保存一个datetime,该数据库是用doctrine schema工具创建的。在我的表单中,我设置了日期和时间,并希望将其保存为数据库中的datetime。

所以我试了一下:

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

但是我得到了一个错误:

代码语言:javascript
复制
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

有没有人有这方面的经验,能够帮助我解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-19 01:30:52

对于DQL DateTime和datetime类型,Doctrine2需要PHP对象。

如果您不是被强制使用Zend_Date,请执行以下操作:

代码语言:javascript
复制
->setStartDateTime(new DateTime('2011-09-01T22:00:00'))

否则,将其转换为DateTime:

代码语言:javascript
复制
new DateTime('@' . $zendDate->getTimestamp())

请参见DateTime文档。

票数 4
EN

Stack Overflow用户

发布于 2011-11-05 00:17:32

您可以覆盖原生数据类型以使用Zend_Date而不是DateTime,后者是Doctrine数据类型“datetime”、“time”和“date”的默认设置。

首先,在应用程序引导文件中,在实例化Doctrine EntityManager之前添加以下内容。此代码应位于任何其他Doctrine代码之前:

代码语言:javascript
复制
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类的示例:

代码语言:javascript
复制
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。

票数 5
EN

Stack Overflow用户

发布于 2011-09-19 15:53:31

您可以实现Custom Mapping Type或使用此ZendDateType实现。

你可能会发现这个guide很有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7463137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档