Doctrine のガイドラインに従って、エンティティのデフォルト値を設定する方法を理解しましたが、日付/時刻スタンプが必要な場合はどうすればよいですか?
私の問題は、データベースのフィールドにデフォルトの NOW() があることですが、Doctrine を使用してレコードを挿入すると、値は null または空白になりますが、残りの挿入は行われます。
また、Doctrine ではデフォルトを const として宣言するように指示されているため、これも問題を引き起こします。
提案?
Doctrine のガイドラインに従って、エンティティのデフォルト値を設定する方法を理解しましたが、日付/時刻スタンプが必要な場合はどうすればよいですか?
私の問題は、データベースのフィールドにデフォルトの NOW() があることですが、Doctrine を使用してレコードを挿入すると、値は null または空白になりますが、残りの挿入は行われます。
また、Doctrine ではデフォルトを const として宣言するように指示されているため、これも問題を引き起こします。
提案?
わかりました私は解決策を見つけました:
オプションはprePersist
私がやっていることです。
注釈で必ず定義してください
<?php
/** @Entity
* @HasLifecycleCallbacks
*/
class User
そして、これが彼らが提供する機能の例です
/**
* @PrePersist
*/
public function doStuffOnPrePersist()
{
$this->createdAt = date('Y-m-d H:i:s');
}
私のように ORM を使用している場合は、
<?php
/** @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class User
そして、これが彼らが提供する機能の例です
/**
* @ORM\PrePersist
*/
public function doStuffOnPrePersist()
{
$this->createdAt = date('Y-m-d H:i:s');
}
私の経験では、エンティティにすべてを配置し、データベースに ORM を強制的にバイパスさせないことが最善です。
<?php
namespace Phill\PaffordBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Stack
* @ORM\Table()
*/
class Stack
{
/**
* @var integer
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \DateTime
* @ORM\Column(type="datetime")
*/
private $startDate;
public function __construct()
{
$this->startDate = new \DateTime();
}
}
正確にするために、 をNOW()
拡張できますDoctrine\DBAL\Types\DateTimeType
。
他の方法:
class DateTimeNow
{
public function format()
{
return 'NOW()';
}
}
$entity->setFieldDatetime(DateTimeNow())
次に、代わりに使用できます$entity->setFieldDatetime(new Datetime())
。
注: このメソッドformat()
は Doctrine によって自動的に呼び出されます。
now
PostgreSQLの場合、タイムスタンプを機能させるには、フィールドの文字列値を渡すことができるはずです。
#[ORM\Column(type: 'datetime_immutable', options: ['default' => 'CURRENT_TIMESTAMP'])]
private $createdAt;
#[ORM\Column(type: 'datetime_immutable', options: ['default' => 'CURRENT_TIMESTAMP'], columnDefinition: "DATETIME on update CURRENT_TIMESTAMP")]
private $modifiedAt;
これは私が見つけたものであり、「ON UPDATE CURRENT_TIMESTAMP()」を取得できましたが、列はnull可能になり、私の意見ではより良いトレードオフです。