12

タイムスタンプをデータベースに保存する最良の方法がわかりません。日付全体を時間分と秒で保存したいのですが、日付 (たとえば 2012-07-14 ) のみを保存し、2012-07-14 HH:MM:SS を保存したいと考えています。dateTime オブジェクトを使用しています。コードは次のとおりです。

コントローラーで:

$user->setCreated(new \DateTime());

エンティティ内:

/**
 * @var date $created
 *
 * @ORM\Column(name="created", type="date")
 */
private $created;

日付と時刻を別々にデータベースに保存する方が良いですか? または YYYY-MM-DD HH:MM:SS のようにまとめて保存する方が良いですか? 次に、日付を比較して残り時間を計算する必要があるため、後で操作を簡素化するために重要です。それで、あなたはどう思いますか ?誰かが私を助けることができますか?

4

4 に答える 4

12

データベースにタイムスタンプを格納する最良の方法は、データベースがそのタイプをサポートしている場合は、明らかにタイムスタンプ列を使用することです。また、作成時にその列を自動更新するように設定できるため、セッターを提供する必要もありません。

Doctrine 2には、タイムスタンプ可能な動作拡張機能があります。これは、ユーザーランド側からも正確に実行されます。

タイムスタンプ可能な動作により、エンティティまたはドキュメントの日付フィールドの更新が自動化されます。注釈を介して機能し、作成時、更新時、または特定のプロパティ値の変更時にフィールドを更新できます。

特徴:

  • 作成時、更新時、さらにはレコードのプロパティ変更時の自動事前定義日付フィールド更新
  • 同じリスナーを使用したORMとODMのサポート
  • プロパティの特定の注釈、およびインターフェイスは必要ありません
  • 特定のプロパティまたは特定の値への関係の変更に反応できます
  • 他の動作とネストできます
  • 拡張機能の注釈、YamlおよびXmlマッピングのサポート

この動作では、注釈を次のように変更するだけです。

/**
 * @var datetime $created
 *
 * @Gedmo\Timestampable(on="create")
 * @ORM\Column(type="datetime")
 */
private $created;

setCreatedその後、コードを呼び出す必要はありません。このフィールドは、エンティティが初めて作成されたときに自動的に設定されます。

于 2012-07-16T13:32:40.930 に答える
11

Doctrineの Timestampable 動作を使用せずに作成日を保存するために、クラスを宣言するときに注釈を追加することにより、LifeCycle Callbacksを使用することもできます。YYYY-MM-DD HH:MM:SSをデータベース@ORM\HasLifecycleCallbacksに保存する場合、次のようになります。

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="yourTable")
 */
class Nasy
{

    /**
    * @ORM\Column(name="created", type="string", length=255)
    */

    private $created;
    /**
     * @ORM\PrePersist
     */
    public function doStuffOnPrePersist()
    {
        $this->created = date('Y-m-d H:i:s');
    }

最後に、タイムゾーンに問題がある場合は、ログイン時にイベント リスナーを使用してセッションにタイムゾーンを設定できます。Matt Drolette は、こちらのブログで素晴らしい成果を上げました。いずれにしても、サーバーのタイムゾーンで常に時刻を保存することになるでしょう。次に、セッションで設定されたタイムゾーンを使用して、適切な時間をユーザーに表示します。幸運を。

于 2012-07-24T13:36:58.997 に答える
5

@Prattの回答に基づいて、これを行いました。エンティティには、作成用と変更用の 2 つのフィールドがあります。

/**
* @ORM\Column(type="datetime")
 */
protected $created_at;

/**
* @ORM\Column(type="datetime")
 */
protected $modified_at;

そして、注釈を使用して、これを prePersist と preUpdate で呼び出します

/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function updatedTimestamps()
{
    $this->setModifiedAt(new \DateTime(date('Y-m-d H:i:s')));

    if($this->getCreatedAt() == null)
    {
        $this->setCreatedAt(new \DateTime(date('Y-m-d H:i:s')));
    }
}

この関数は、作成用と更新用の 2 つの関数に分割できますが、これは機能しているため、正常に機能している場合に余分なコードを追加する理由はわかりません。

于 2012-10-31T14:05:09.283 に答える
4

次のように @Version を使用できます。

/**
 * @var date $created
 *
 * @ORM\Column(name="created", type="datetime")
 * @ORM\Version
 */
private $created;

これは日時型でのみ機能します。

于 2014-03-18T17:29:51.503 に答える