いくつかの理由で、TIMESTAMP
フィールドを持つテーブルが必要です。
独自のタイムスタンプタイプ(Doctrine\DBAL\Types\Type
)を作成しましたが、正常に機能します。
しかし、データベース構造を更新しようとすると、これが発生しました。
コマンドライン
ede80:~>php app/console doctrine:schema:update --force --complete
Updating database schema...
[Doctrine\DBAL\Exception\DriverException]
An exception occurred while executing 'ALTER TABLE MY_TABLE CHANGE DATE_CREATION DATE_CREATION timestamp DEFAULT NULL'
SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'DATE_CREATION'
SQLクエリ
データベースで次のクエリを実行すると、機能します。
ALTER TABLE MY_TABLE CHANGE DATE_CREATION DATE_CREATION timestamp DEFAULT CURRENT_TIMESTAMP
ORM.YML
しかし、私がそれを変更しようとするとMyTable.orm.yml
、次のようになります:
dateCreation:
type: timestamp
nullable: true
column: DATE_CREATION
options:
default: CURRENT_TIMESTAMP
実行されるクエリは
ALTER TABLE MY_TABLE CHANGE DATE_CREATION DATE_CREATION timestamp DEFAULT 'CURRENT_TIMESTAMP'
そしてそれは失敗します。
データベースの構造を最新の状態にできるように、実際のデフォルト値を設定するにはどうすればよいですか?私はすでに設定しようoptions: default
と0
、NULL
、CURRENT_TIMESTAMP
、00:00:01
...
PHP 5.3.3 MySQL 5.1.63
これがタイムスタンプタイプです
convert *()はそれほど良くないと思います。
<?php
namespace CNAMTS\PHPK\CoreBundle\Doctrine\Type;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
/**
*/
class Timestamp extends Type
{
const TIMESTAMP = 'timestamp';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return $platform->getDoctrineTypeMapping('TIMESTAMP');
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return ($value === null) ? 0 : new \DateTime($value);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return ($value === null) ? 0 : $value->format(\DateTime::W3C);
}
public function getName()
{
return self::TIMESTAMP;
}
}
これは、テーブルに複数のタイムスタンプフィールドを含めるためのソリューションです。
AppKernel.phpで独自のタイムスタンプタイプを定義して追加する必要があります。
public function boot() {
parent::boot();
/**
* SQL type TIMESTAMP
*/
$em = $this->container->get('doctrine.orm.default_entity_manager');
Doctrine\DBAL\Types\Type::addType('timestamp', 'My\CoreBundle\Doctrine\Type\Timestamp');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('TIMESTAMP', 'timestamp');
}
エンティティ定義では、MyEntity.orm.yml:
dateCreation:
type: timestamp
nullable: false
column: DATE_CREATION
columnDefinition: TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'
dateModification:
type: timestamp
nullable: false
column: DATE_MODIFICATION
columnDefinition: TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
そして、エンティティMyEntity.phpに、prePersistがあります:
public function doPrePersist()
{
$this->dateCreation = new \DateTime();
}
それが私がそれを機能させた方法です:-)あなたの助けのためにすべてThx!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加