教义 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-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();

【问题讨论】:

2013-01-00 不是有效日期,因此 phpDateTime 对象和 mysqlDATE 类型应该将其“转换”为有效日期。反正你为什么要存放这么奇怪的东西? 你能快速显示一个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-2012Game::SHOW_DATE), 2015 (01-01-2015, Game::SHOW_YEAR), 2012 年 3 月(01-03-2012Game::SHOW_MONTH), 2020 年夏季(01-06-2012Game::SHOW_SEASON),2010 年冬季(01-12-2010Game::SHOW_SEASON

【讨论】:

以上是关于教义 2.1 - 日期时间问题的主要内容,如果未能解决你的问题,请参考以下文章

教义 OneByOne 和日期

如何在教义中进行复杂的SQL查询

Symfony 4 - 设置日期时间

在教义中只加入一行

检查日期是不是已存在于另一个时间段中

当 Symfony 教义对象的一个​​属性发生变化时更新另一个属性