Как правильно хранить дату и время в 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, но независимо от того, что я пробовал, эта ошибка продолжает появляться. Кто-нибудь?

4

Решение

Нет необходимости использовать NOW при создании нового объекта 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);
4

Другие решения

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

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

Например

// 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);
1

По вопросам рекламы [email protected]