原则2.1-日期时间问题


Doctrine 2.1 - DateTime issue

我在数据库表中有premiere_poland列,它是date类型。

/** @Column(type="date", nullable=TRUE) */
    protected $premiere_poland;

我的问题是,我想存储2012-01-012013-00-002013-01-00等日期,我想要那种类型的日期,但Doctrine每次都会在DateTime实例中返回该列数据,并且真实形式会更改(例如2013-01-00=31.12.2012)。

如何使Doctrine将此值作为字符串而不是DateTime类实例返回。

我的查询:

    $q = "SELECT
            g,
            p.name AS platform_name, p.name_short AS platform_name_short, p.id AS platform_id,
            s.premiere_poland, s.premiere_world
          FROM Game g
            JOIN g.genres ge
            JOIN g.platform p
            LEFT JOIN g.specification s
          WHERE g.id = :id";
    $results = $db->createQuery($q)->setParameter('id', $_GET['id'])->getResult();

@Crozin因为我需要一个存储游戏首映日期的专栏,首映日期可能还不完全清楚(例如2013年3月或仅一年)。

我建议创建两列,一列用于日期(类型为DateTime/DATE),另一列用于指示在显示首映日期(类型SET或位掩码)时应考虑日期的哪些部分(日、月、年)。

显示首映日期的功能可能如下所示:

// "parts" is a name of the last column - it should be renamed into something
// more adequate. Names of constants also aren't well adequate
function getFormattedPremiereDate() {
    if ($this->abc & Game::SHOW_YEAR_ONLY) {
        return $this->premierePoland->format('%y');
    }
    if ($this->abc & Game::SHOW_YEAR_AND_MONTH_ONLY) {
        return $this->premierePoland->format('%m %y');
    }
    if ($this->abc & Game::SHOW_DATE) {
        return $this->premierePoland->format('%d %m %y');
    }
}

当然,这个函数不应该放在实体对象中——它太复杂了(尤其是如果我们考虑i18n和i10l的话),而且与实体"无关"。

这个技术应该让你显示以下日期:

  • 2012年6月12日(12-06-2012Game::SHOW_DATE
  • 2015(01-01-2015Game::SHOW_YEAR
  • 2012年3月(01-03-2012Game::SHOW_MONTH
  • 2020年夏季(01-06-2012Game::SHOW_SEASON),2010年冬季(01-12-2010Game::SHOW_SEASON