Как мне правильно хранить дату и время в Symfony 3?

Я пытаюсь сохранить дату и время mysql в репозитории Symfony и получаю сообщение об ошибке. Пробовал несколько предложений из Интернета и здесь, в стеке, но ничего не устраняет эту ошибку. Это то, что я пытаюсь сделать (код сокращен для ясности)

Поле моей сущности:

/**
 * @var \DateTime
 *
 * @ORM\Column(name="created", type="datetime")
 */
private $created;

Мой код репо:

$reservedays = 84;
$now = new \DateTime('NOW');
$now->modify('+' . $reservedays .' days');
$payment = new AppBundle\Entity\Payment;
$payment->setCreated( $now->format('Y-m-d h:i:s') );

Но я постоянно получаю эту ошибку:

Error: Call to a member function format() on string
500 Internal Server Error - FatalErrorException 

Stack Trace:
1. in vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php at line 53  -

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return ($value !== null)
            ? $value->format($platform->getDateTimeFormatString()) : null;
    }
    /**

Как вы можете видеть, я хочу взять текущую дату и добавить к ней 84 дня, а затем сохранить ее в mysql datetime, но независимо от того, что я пробовал, эта ошибка продолжает появляться. Кто-нибудь?


person pogeybait    schedule 18.03.2017    source источник
comment
Передайте фактический объект datetime: $ payment- ›setCreated ($ now);   -  person Cerad    schedule 19.03.2017
comment
$ now - это строка в соответствии с вызывающей функцией format (). Этого не должно быть. Попробуйте взять СЕЙЧАС как параметр в вашем репо   -  person Bango    schedule 19.03.2017
comment
Также см. это сообщение SO   -  person Bango    schedule 19.03.2017


Ответы (2)


Нет необходимости использовать «СЕЙЧАС» при создании нового объекта DateTime. Вы можете просто использовать $now = new \DateTime() для фактической даты / времени.

В вашем случае - полностью ок. чтобы создать объект DateTime, измените его, добавив XYdays, поэтому:

$reservedays = 84;
$now = new \DateTime();
$now->modify('+' . $reservedays .' days');

Но тогда вы должны использовать объект DateTime в качестве параметра метода setCreated(), потому что свойство $created имеет тип \ DateTime. Уровень Doctrine в Symfony заботится о правильном сохранении данных в БД, поэтому это должно работать нормально:

$payment = new AppBundle\Entity\Payment;
$payment->setCreated($now);
person Jan Rydrych    schedule 18.03.2017

Вы пытаетесь сохранить string в datetime столбце. Прекратите звонить format() // <- Returns a string, и это сработает.

Кроме того, вы можете все упростить, инициализировав $createdAt в конструкторе вашего объекта Payment. метод. Конструктор вызывается всякий раз, когда вызывается новый экземпляр этого класса. Вы также можете передавать переменные в конструктор.

Например

// AppBundle\Entity\Payment
//...
class Payment
{
    //...
    // Set a default value for the passed-in variable.
    public function __construct($reserveDays = 0)
    {
        $this->createdAt = new \DateTime('+'.$reserveDays.' days');
    }
}

использование

// AppBundle\Controller\PaymentController.php
//...
$payment = new AppBundle\Entity\Payment(84);
person Rhono    schedule 19.03.2017
comment
Ваш ответ также был правильным, но ответ Хонзы очень напоминал опубликованный мною код, поэтому я принял его, чтобы избежать путаницы для других, кто мог бы прочитать этот ответ. - person pogeybait; 19.03.2017