2

doctrine schema ツールで作成されたデータベースに日時を保存したいと考えています。私のフォームでは、日付と時刻を設定し、データベースに日時として保存したいと考えています。

だから私はこれを試しました:

$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

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 になります。

于 2011-11-04T16:17:31.837 に答える
4

Doctrine2 は、DQL の date および datetime 型の 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 に答える