Автоматическое создание даты - аннотация - Codeigniter 2 и Doctrine 2 - PullRequest
4 голосов
/ 29 октября 2011

Я использую Doctrine 2 с Codeigniter 2, и я хотел бы, чтобы Doctrine автоматически генерировало текущую дату при вставке в данное поле таблицы.

ФАЙЛ КЛАССА:

<?php 
namespace models;

/**
 * @Entity
 * @Table(name="workers")
 */
class Workers {
    /**
     * @Id
     * @Column(type="integer", nullable=false)
     * @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @Column(type="string", length=255, unique=true, nullable=false)
     */
    protected $email;

    /**
     * @var datetime $created_on
     * 
     * @gedmo:Timestampable(on="create")
     * @Column(type="datetime")
     */
    protected $created_on;


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

    /* Setters & Getters */
    public function setEmail($email){ $this->email = $email; }
    public function getEmail(){ return $this->email; }
}

МЕТОД ВСТАВКИ:

$worker = new models\Workers();
$worker->setEmail($data['email']);
$this->em->persist($worker);
$this->em->flush();

Каждый раз, когда я вставляю новую запись в таблицу «работники», вместо даты вставки всегда присутствует поле created_on NULL. Что я делаю не так?

Ответы [ 3 ]

11 голосов
/ 09 декабря 2011

Если я не прав, поправьте меня, пожалуйста.Но я знал, что Doctrine не поддерживает дефолт.Вы делаете это на уровне php, как

/**
 * @Column(type="string", length=255)
 */
private $something = "blabla";

Глядя на ваш исходный код, я вижу, что вы используете расширение gedmo для доктрины.Я прав?Таким образом, у вас есть два способа сделать это.

1) Просто с помощью Doctrine, нет Gedmo Внимательно прочитайте это руководство и вы заметите аннотации @HasLifecycleCallbacks.

Таким образом, вы должны отредактировать свой код как;

ФАЙЛ КЛАССА

<?php 
  namespace models;

 /**
  * @Entity
  * @Table(name="workers")
  * @HasLifecycleCallbacks
  */
class Workers {
 /**
  * @Id
  * @Column(type="integer", nullable=false)
  * @GeneratedValue(strategy="AUTO")
  */
 protected $id;

 /**
  * @Column(type="string", length=255, unique=true, nullable=false)
  */
 protected $email;

 /**
  * @var datetime $created_on
  * @Column(type="datetime")
  */
protected $created_on;

 /** @PrePersist */
 function onPrePersist()
 {
     //using Doctrine DateTime here
     $this->created_on = new \DateTime('now');
 }

 /* Setters & Getters */
 public function setEmail($email){ $this->email = $email; }
 public function getEmail(){ return $this->email; }
}

2) Использование Gedmo

Если вы предпочитаете использовать расширение Gedmo Timestampable, просто отбросьте предварительный список функций, потому что gedmo сделает все за вас.Я также проверил мои исходные коды.Я надеюсь, что у меня нет неправильных предсказаний здесь

CLASS FILE

<?php 
  namespace models;

 /**
  * @Entity
  * @Table(name="workers")
  */
class Workers {
 /**
  * @Id
  * @Column(type="integer", nullable=false)
  * @GeneratedValue(strategy="AUTO")
  */
 protected $id;

 /**
  * @Column(type="string", length=255, unique=true, nullable=false)
  */
 protected $email;

 /**
  * @var datetime $created_on
  * @Column(type="datetime")
  * @gedmo:Timestampable(on="create")
  */
protected $created_on;

 /* Setters & Getters */
 public function setEmail($email){ $this->email = $email; }
 public function getEmail(){ return $this->email; }
}
11 голосов
/ 04 марта 2013

Для доктрины 2.3 используйте

/**
 * @var datetime $created_on
 * 
 * @Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"})
 */
protected $created_on;
1 голос
/ 03 ноября 2011

Вы можете попробовать следующее:

/**
 * @var timestamp $created_on
 * 
 * @Column(type="timestamp", default="CURRENT_TIMESTAMP")
 */
protected $created_on;
...