Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Doctrine - Add default time stamp to entity like NOW()

Following the Doctrine guidelines I understand how to set a default value for an Entity, but what if I wanted a date/time stamp?

  • http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/faq.html

My problem is my database has a default of NOW() on a field but when I use Doctrine to insert a record the values are null or blank but the rest of the insert happened.

Also since Doctrine says to declare the default as a const, this also creates a problem.

Suggestions?

like image 573
Phill Pafford Avatar asked Dec 12 '12 23:12

Phill Pafford


2 Answers

Ok I found the solution:

  • https://doctrine-orm.readthedocs.org/en/latest/reference/php-mapping.html?highlight=callback
  • http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#lifecycle-events

The prePersist option is what I'm doing.

Make sure you define in the annotations

<?php

/** @Entity 
 *  @HasLifecycleCallbacks 
 */
class User

and here is the function example they offer

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

And if you're using ORM like I am

<?php

/** @ORM\Entity 
 *  @ORM\HasLifecycleCallbacks 
 */
class User

and here is the function example they offer

/** 
 *  @ORM\PrePersist 
 */
public function doStuffOnPrePersist()
{
    $this->createdAt = date('Y-m-d H:i:s');
}
like image 56
Phill Pafford Avatar answered Oct 09 '22 07:10

Phill Pafford


In my experience it is best to put everything in your Entities and not try to force your database to bypass the 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();
  }

}
like image 37
David Baucum Avatar answered Oct 09 '22 09:10

David Baucum