MySqlTIMESTAMP
の代わりにdoctrine を使用する方法を探しています。DATETIME
さらに、デフォルト値としてON UPDATE CURRENT_TIMESTAMP
とを設定する必要があります。CURRENT_TIMESTAMP
このすべてのコードを PHP アノテーションに含めて、すべてを 1 か所にまとめられるようにしたいと考えています。
どうやってやるの?
MySqlTIMESTAMP
の代わりにdoctrine を使用する方法を探しています。DATETIME
さらに、デフォルト値としてON UPDATE CURRENT_TIMESTAMP
とを設定する必要があります。CURRENT_TIMESTAMP
このすべてのコードを PHP アノテーションに含めて、すべてを 1 か所にまとめられるようにしたいと考えています。
どうやってやるの?
何時間もの検索の後、私は答えを見つけました。これが、エンティティのライフサイクルや WRONG 列タイプよりも満足のいく解決策を探している他の人に役立つことを願っています (aは値TIMESTAMP
を格納するだけでなく、特定の動作を持つ特定のタイプであるため)datetime
あなたがする必要があるのは、追加することだけです
* @ORM\Column(type="datetime", nullable=false)
* @ORM\Version
注釈に追加すると、Doctrine はTIMESTAMP
列を作成しDEFAULT CURRENT_TIMESTAMP
、実際のテーブル値を有効な\DateTime
オブジェクトとして返します。
TIMESTAMP
Doctrine で mysql を使用するようなものはありません。ただし、自分で修正しましたが、テストする必要があります。
Doctrine\DBAL\Types\TimestampType.php
TimeType.php
ますTimestampType.php
Doctrine\DBAL\Types\Type.php
getTimestampTypeDeclarationSQL
するDoctrine\DBAL\Platforms\AbstractPlatform.php
TIMESTAMP
yaml
エンティティとプロキシを作成するために使用したので、次のように使用しますyaml
。
type: timestamp
この「修正」/「回避策」を今すぐテストします。知らせます。
/**
* @var \DateTime
* @ORM\Column(type="datetime", columnDefinition="timestamp default current_timestamp")
*/
protected $createdAt;
/**
* @var \DateTime
* @ORM\Column(type="datetime", columnDefinition="timestamp default current_timestamp on update current_timestamp")
*/
protected $updatedAt;
@Polichism は適切なロジックを提供しましたが、パッチは受け入れられませんでした。代わりに、ユーザーはカスタム タイプを追加するように指示されました。私はそれを組み合わせて実装しました:
最終バージョンは GitHub で見つけることができます。
注:ファイルが後で削除された場合にリンクが有効なままであることを確認するために、特定のコミットにリンクしました。履歴を使用して、新しいバージョンを確認します。
/** @ORM\Column(type="datetime", nullable=false ) */
protected $created;
これにより、タイムスタンプが作成され、日時オブジェクトが返されます
public function __construct()
{
$this->created = new \DateTime();
}
@ORM\Version は、エンティティごとに 1 つのプロパティに対してのみ機能するため、テーブルに複数のタイムスタンプ フィールドが必要な場合はオプションではありません。