Сохранение даты Zend в базе данных с помощью Doctrine 2.1 - PullRequest
2 голосов
/ 18 сентября 2011

Я хочу сохранить дату и время в базе данных, которая была создана с помощью инструмента схемы доктрины. В своей форме я установил дату и время и хочу сохранить их в качестве даты и времени в базе данных.

Итак, я попробовал это:

$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

Кто-нибудь имеет опыт в этом и может помочь мне с этой проблемой?

Ответы [ 3 ]

5 голосов
/ 04 ноября 2011

Вы можете переопределить собственные типы данных, чтобы использовать Zend_Date вместо собственного DateTime в PHP, который используется по умолчанию для типов данных Doctrine «datetime», «time» и «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 класса. Для этого проще всего расширить соответствующие классы Доктрины. Код фактически одинаков для всех трех классов, единственное отличие состоит в том, какой класс вы расширяете, и в названии вашего класса. Вот класс 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 (type = "datetime") в Doctrine. При сохранении в базе данных вы можете сохранять свойства сущностей типа «datetime» в экземплярах Zend_Date. Также при извлечении сущностей из базы данных свойства типа "datetime" теперь будут иметь Zend_Dates.

4 голосов
/ 18 сентября 2011

Doctrine2 ожидает объекты PHP DateTime для типов даты и даты и времени DQL.

Если вы не обязаны использовать Zend_Date, для этого:

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

Иначе, преобразуйте его в DateTime:

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

См. DateTime документы.

3 голосов
/ 19 сентября 2011

Вы можете реализовать Пользовательский тип отображения или использовать эту ZendDateType реализацию.

Вы можете найти это руководство полезным.

...