0

在我的 Symfony/Doctrine 应用程序中,我希望将数据库中的任何时间戳字段作为 PEARDate对象而不是日期字符串进行检索。例如,如果我的架构是

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

我希望能够运行 Doctrine 查询来检索SomeEvent对象并$anEvent->getStart()成为 PEARDate对象。现在,Doctrine 为我提供了所有基本上没用的时间戳字段的字符串。(我也希望保存日期以正常工作。)

实现这一目标的最佳方法是什么?

我使用 Hydration 侦听器进行了研究,但看起来我必须为每个表注册它并硬编码我想要转换的列名。从那以后,使用定制的 Hydrator 看起来并没有好多少,我失去了使用任何其他核心水合方法的能力,而我的日期又变成了字符串。

编辑:看起来 Doctrine 2 有一个正是我正在寻找的功能:自定义映射类型。不幸的是,这个站点被部署到一个不支持 PHP 5.3+ 的主机上,所以 Doctrine 2 出来了。:(

4

1 回答 1

0

我想出了一个我不太满意的 hacky 方法,但它确实有效。我创建了以下 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在加载事物时创建对象。我还修改了实际的 PEARDate类(我知道......不好)并添加了一个__toString()返回$this->getDate(). PHP 然后在教义保存日期时自动将日期转换为正确的字符串。

如果有人找到更好的方法来做到这一点,请发布。

于 2011-03-15T20:23:58.220 回答