教义 2.1 - 日期时间问题
Posted
技术标签:
【中文标题】教义 2.1 - 日期时间问题【英文标题】:Doctrine 2.1 - DateTime issue 【发布时间】:2012-02-07 16:01:20 【问题描述】:我在数据库表中有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();
【问题讨论】:
2013-01-00
不是有效日期,因此 php 的 DateTime
对象和 mysql 的 DATE
类型应该将其“转换”为有效日期。反正你为什么要存放这么奇怪的东西?
你能快速显示一个var_dump($object->premier_poland)
吗?根据docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/…,您的设置中的一切看起来都是正确的
@Crozin 因为我需要存储游戏日期首映的列,而首映可能不完全清楚(例如 2013 年 3 月或仅一年)。 @Mike 是的,但如果我在数据库中有2013-01-00
var_dump 将返回我string(10) "31.12.2012"
。这是错误的;p。
@KrzysztofTrzos 谢谢。很高兴 Crozin 能够提供解决方案 :)
【参考方案1】:
@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
)
【讨论】:
以上是关于教义 2.1 - 日期时间问题的主要内容,如果未能解决你的问题,请参考以下文章