16

Doctrine のガイドラインに従って、エンティティのデフォルト値を設定する方法を理解しましたが、日付/時刻スタンプが必要な場合はどうすればよいですか?

私の問題は、データベースのフィールドにデフォルトの NOW() があることですが、Doctrine を使用してレコードを挿入すると、値は null または空白になりますが、残りの挿入は行われます。

また、Doctrine ではデフォルトを const として宣言するように指示されているため、これも問題を引き起こします。

提案?

4

7 に答える 7

27

わかりました私は解決策を見つけました:

オプションは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');
}
于 2012-12-14T14:28:36.333 に答える
9

私の経験では、エンティティにすべてを配置し、データベースに 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();
  }

}
于 2014-08-06T22:30:31.443 に答える
7

正確にするために、 をNOW()拡張できますDoctrine\DBAL\Types\DateTimeType

他の方法:

class DateTimeNow
{
    public function format() 
    {
        return 'NOW()';
    }
}

$entity->setFieldDatetime(DateTimeNow())次に、代わりに使用できます$entity->setFieldDatetime(new Datetime())
注: このメソッドformat()は Doctrine によって自動的に呼び出されます。

于 2015-04-01T06:52:41.340 に答える
0

nowPostgreSQLの場合、タイムスタンプを機能させるには、フィールドの文字列値を渡すことができるはずです。

于 2012-12-12T23:53:16.637 に答える
0
#[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可能になり、私の意見ではより良いトレードオフです。

于 2021-12-27T08:20:45.070 に答える