2011-10-29 49 views
4

我在Codeigniter 2中使用Doctrine 2,我希望Doctrine自動生成表中給定字段中插入的當前日期。自動創建日期 - annoation - Codeigniter 2和Doctrine 2

類文件:

<?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方法:

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

每次我在表中 「工」 插入新的記錄,有永諾created_onNULL,而不是插入日期。我究竟做錯了什麼?

回答

11

如果我錯了,糾正我請。但我知道,好像學說不支持默認。你這樣做在PHP級別,如

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

看看你的源代碼,我看到你正在使用gedmo擴展的教條。我對嗎?所以你有兩種方法來做到這一點。

1)剛開始使用學說,沒有Gedmo
閱讀this manual非常仔細,你會發現@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擴展,那麼就放棄對你的功能prepersist,原因gedmo正在做的一切。我也檢查了我的源代碼。我希望我沒有在這裏

類文件

<?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; } 
} 
+0

謝謝你的解決方案。我解決了沒有GEDMO擴展..謝謝! – Puzo

+1

歡迎您:) –

+0

我使用這個默認值:@ORM \ Column(type =「integer」,options = {「default」:1})' – woodo

1

您可以嘗試以下內容:

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

謝謝。我會盡快解決我的新問題 - http://stackoverflow.com/questions/7985676/codeigniter-doctrine-inserting-error-many-to-one-relation – Puzo

+0

當我嘗試你的解決方案時,仍然錯誤 - http://pastebin.com/pC313P0S。任何想法? – Puzo

+0

類型必須是日期時間,儘管它將作爲時間戳應用於默認值CURRENT_TIMESTAMP ...時間戳只是不是有效的類型! – MediaVince

11

教義2.3錯誤的預測,使用

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