【问题标题】:Doctrine 2.1 - DateTime issue教义 2.1 - 日期时间问题
【发布时间】: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 不是有效日期,因此 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 能够提供解决方案 :)

标签: php doctrine-orm


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2014-09-04
    • 2019-11-25
    相关资源
    最近更新 更多