自动创建数据 - 注释 - Codeigniter 2和Doctrine 2

时间:2011-10-29 12:05:28

标签: codeigniter datetime doctrine automation annotations

我正在使用Codeigniter 2的Doctrine 2,我希望Doctrine在表格的给定字段中自动生成插入的当前日期。

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
     * 
     * @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; }
}

INSERT METHOD:

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

每次我在表格“工人”中插入新记录时,都会有created_on字段NULL而不是插入日期。我做错了什么?

3 个答案:

答案 0 :(得分:11)

如果我错了,请纠正我。但我知道,如果Doctrine不支持默认。你可以在php等级中执行此操作,如

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

查看您的源代码,我看到您正在使用gedmo扩展来进行教义。我对吗?所以你有两种方法可以做到这一点。

1)只使用Doctrine,No Gedmo
仔细阅读this manual,您会注意到@HasLifecycleCallbacks Annotations。

因此,您应该将代码编辑为;

CLASS FILE

<?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扩展,那么只需删除该函数prepersist,因为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; }
}

答案 1 :(得分:11)

对于学说2.3,请使用

/**
 * @var datetime $created_on
 * 
 * @Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"})
 */
protected $created_on;

答案 2 :(得分:1)

您可以尝试以下方法:

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