Как установить дату в Doctrine 2?

У меня есть поле с именем «день рождения» в сущности доктрины.

Я хотел бы создать объект для добавления в базу данных с помощью доктрины.

Внутри контроллера:

$name = "John Alex";
$birthday = "11-11-90";
$student = new Student();
$student->setName($name);
$student->setBirthday(strtotime($birthday);
...

но когда я пытаюсь продолжить, я получаю эту ошибку

Fatal error: Call to a member function format() on a non-object in /Library/WebServer/Documents/Symfony/vendor/doctrine-dbal/lib/Doctrine/DBAL/Types/DateType.php on line 44

Изменить:

Моя сущность:

/**
 * @var string $name
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @var date $birthday
 *
 * @ORM\Column(name="birthday", type="date", nullable=true)
 */
private $birthday;

/**
 * Set birthday
 *
 * @param date $birthday
 */
public function setBirthday($birthday)
{
    $this->birthday = $birthday;
}

/**
 * Get birthday
 *
 * @return date 
 */
public function getBirthday()
{
    return $this->birthday;
}

person Akrramo    schedule 31.05.2012    source источник
comment
Не могли бы вы показать нам свою сущность, связанную со Студентом? И вы проверили этот ответ ?   -  person j0k    schedule 31.05.2012
comment
pastebin.com/8D7tdSef (я не могу редактировать тему)   -  person Akrramo    schedule 31.05.2012
comment
Вы проверили этот ответ? - о дате и времени   -  person j0k    schedule 31.05.2012


Ответы (2)


Поля ваших сущностей, отображаемые как "datetime" или "date", должны содержать экземпляры DateTime.

Следовательно, ваш сеттер должен иметь следующий тип:

/**
 * Set birthday
 *
 * @param \DateTime|null $birthday
 */
public function setBirthday(\DateTime $birthday = null)
{
    $this->birthday = $birthday ? clone $birthday : null;
}

/**
 * Get birthday
 *
 * @return \DateTime|null 
 */
public function getBirthday()
{
    return $this->birthday ? clone $this->birthday : null;
}

Это позволяет установить либо null, либо экземпляр DateTime для дня рождения.

Как вы заметили, я также clone указываю значения даты рождения, чтобы избежать нарушения инкапсуляции (см. a-datetime-field/15488230#15488230">Doctrine2 ORM не сохраняет изменения в поле DateTime ).

Чтобы установить день рождения, вы просто делаете следующее:

$student->setBirthday(new \DateTime('11-11-90'));
person Ocramius    schedule 20.03.2013
comment
php app/console doctrine:generate:entities сгенерировал только следующий заголовок метода * @param \DateTime $birthdate, * @return Person, public function setBirthdate($birthdate). Когда я принимаю заголовок метода к public function setBirthdate(\DateTime $birthdate = NULL), я получаю Argument 1 passed to <...>::setBirthdate() must be an instance of DateTime, string given. Но строка пуста (потому что поле формы не заполнено). - person rabudde; 20.03.2013
comment
@rabudde, вы не должны создавать свои сущности. Сущности являются частью вашей кодовой базы и основным компонентом вашего домена. Сгенерированный код, как правило, плохая идея, поскольку вы избегаете его тестирования после создания. Кроме того, похоже, что ваша форма не преобразует пустое значение в значение null. - person Ocramius; 20.03.2013

person    schedule
comment
блестяще, это была моя проблема, когда я пытался вручную установить некоторые типы даты и времени в базе данных mysql. - person blamb; 12.10.2014