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