Доктрина 2.1 - Дата-время выпуска - PullRequest
1 голос
/ 07 февраля 2012

У меня есть столбец 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();

1 Ответ

3 голосов
/ 07 февраля 2012

@ Crozin Поскольку мне нужен столбец, в котором хранятся даты игр, премьеры и премьера может быть не полностью известна (например, март 2013 или только год).

Я бы предложил создатьдва столбца, один для даты (типа 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) и «не связанный» с сущностью.

Этот техник должен показывать следующие даты:

  • 12 июня 2012 г. (12-06-2012, Game::SHOW_DATE),
  • 2015 (01-01-2015, Game::SHOW_YEAR),
  • Март 2012 г. (01-03-2012, Game::SHOW_MONTH),
  • Лето 2020 года (01-06-2012, Game::SHOW_SEASON), Зима 2010 года (01-12-2010, Game::SHOW_SEASON)
...