2011-03-11 49 views
0

在我的Symfony /學說的應用,我想在我的數據庫中的任何時間戳字段retreived梨Date對象,而不是日期字符串的。例如如果我的模式是水合物時間戳字段,以PEAR Date對象

SomeEvent: 
    columns: 
     id: 
     type: integer 
     primary: true 
     start: timestamp 
     end: timestamp 

我希望能夠運行一個查詢學說檢索SomeEvent對象,並有$anEvent->getStart()是PEAR Date對象。現在Doctrine爲我提供了所有時間戳字段的字符串,這些字段基本上是無用的。 (我也很喜歡日期的儲蓄才能正常工作。)

什麼是實現這一目標的最佳方式是什麼?

我研究使用水化監聽器,但它看起來像我不得不註冊,每桌並進行硬編碼,我要轉換的列名。使用自定義保溼並沒有看起來好多了,因爲當時我失去了使用任何的其他核心水化方法,而無需我再次日期爲字符串的能力。

編輯:它看起來像教條2有一個功能,正是我所期待的:Custom Mapping Types。不幸的是,這個網站正在部署到一個不支持PHP 5.3+的主機,所以Doctrine 2已經不在了。 。:(

回答

0

我想出了一個哈克的方式做到這一點,我不是超級開心,但它的工作原理,我創建了以下2類:

class DateClassBehavior extends Doctrine_Template { 

    public function setTableDefinition() { 
     $listener = new DateClassListener(); 
     $table = $this->getTable(); 

     foreach ($table->getColumns() as $columnName => $columnDef) { 
     if ($columnDef['type'] == 'timestamp') { 
      $listener->dateColumns[] = $columnName; 
     } 
     } 

     $this->addListener($listener); 
    } 

} 

class DateClassListener extends Doctrine_Record_Listener { 

    public $dateColumns = array(); 

    public function postHydrate(Doctrine_Event $event) { 
     $data = $event->data; 

     foreach ($this->dateColumns as $col) { 
     $date = $data->$col == null ? null : new Date($data->$col); 
     $data->$col = null; 
     $data->$col = $date; 
     } 

     $event->data = $data; 
    } 

} 

並補充DateClassBehavior的定義爲每表在我的模型:

SomeEvent: 
    actAs: [DateClassBehavior] 
    columns: 
     id: 
     type: integer 
     primary: true 
     start: timestamp 
     end: timestamp 

這需要照顧,當事情被載入創建Date對象的我還修改了實際的PEAR Date類(我知道...壞),並增加了一個__toString()方法返回$this->getDate()。當教義保存時,PHP會自動將日期轉換爲正確的字符串。

如果有人找到更好的方法來做到這一點,請張貼。

相關問題