我在数据库表中有premiere_poland
列,它是date
类型。
/** @Column(type="date", nullable=TRUE) */
protected $premiere_poland;
我的问题是,我想存储2012-01-01
、2013-00-00
、2013-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-2012
、Game::SHOW_DATE
) - 2015(
01-01-2015
、Game::SHOW_YEAR
) - 2012年3月(
01-03-2012
、Game::SHOW_MONTH
) - 2020年夏季(
01-06-2012
、Game::SHOW_SEASON
),2010年冬季(01-12-2010
、Game::SHOW_SEASON
)