Свойство наследования таблицы классов Doctrine в запросе имеет неверное значение
Я использую две концепции Доктрины в моей модели:
- наследование таблиц классов
- Обратные вызовы жизненного цикла
Когда я загружаю унаследованный экземпляр моего родительского класса, родительское свойство, которое обновляется с помощью обратного вызова жизненного цикла, неверно, ну, не то значение, которое я имею в таблице родительского класса моей базы данных.
Родительский {абстрактный} класс: пользователь
use DateTime;
/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="MyProject\CoreBundle\Repository\UserRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="entity_name", type="string")
* @ORM\DiscriminatorMap({"member" = "Member", "administrator" = "Administrator"})
* @ORM\HasLifecycleCallbacks()
*/
abstract class User implements AdvancedUserInterface, Serializable
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var DateTime
*
* @ORM\Column(name="created_at", type="datetime")
*/
protected $createdAt;
/**
* @var DateTime
*
* @ORM\Column(name="updated_at", type="datetime")
*/
protected $updatedAt;
// ...
public function __construct()
{
$this->createdAt = new DateTime();
$this->updatedAt = new DateTime();
// ...
return $this;
}
/**
* @ORM\PreUpdate
*/
public function onPreUpdate()
{
$this->updatedAt = new DateTime();
}
}
Детский класс: член
/**
* Member
*
* @ORM\Table(name="members")
* @ORM\Entity(repositoryClass="MyProject\CoreBundle\Repository\MemberRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Member extends User
{
// ...
public function __construct()
{
parent::__construct();
// ...
return $this;
}
}
Потом в контроллере
use MyProject\CoreBundle\Entity\Member;
public function someAction(Member $member)
{
$em = $this->getDoctrine()->getManager();
$member = $em->getRepository(Member::class)->find(1);
exit(var_dump($member->getUpdatedAt()));
// --> date of today, why?
}
Вот выдержка из содержания моей базы данных
// users
|----|---------------------|---------------------|-------------|
| id | created_at | updated_at | entity_name |
|----|---------------------|---------------------|-------------|
| 1 | 2016-01-01 00:00:00 | 2016-06-01 12:00:00 | member |
|----|---------------------|---------------------|-------------|
// members
|----|
| id |
|----|
| 1 |
|----|
Когда я отлаживаю свойство updatedAt моего члена, я ожидаю, что значением будет объект DateTime, соответствующий 2016-06-01 12:00:00
а не дата дня...
Это даже связано с загрузкой наследования? Не могу понять, откуда это взялось.
1 ответ
Ваш updatedAt
может прийти из User
учебный класс. В __construct()
вашей User
класс, вы заполняете данные с помощью $this->createdAt = new DateTime()
а также $this->updatedAt = new DateTime()
, Я думаю, что это плохая практика, потому что createdAt
должен быть заполнен на User
создание и updatedAt
на User
создание или обновление. Попробуйте обновить свой User
класс к этому (удаление __constructor
):
use DateTime;
/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="MyProject\CoreBundle\Repository\UserRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="entity_name", type="string")
* @ORM\DiscriminatorMap({"member" = "Member", "administrator" = "Administrator"})
* @ORM\HasLifecycleCallbacks()
*/
abstract class User implements AdvancedUserInterface, Serializable
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var DateTime
*
* @ORM\Column(name="created_at", type="datetime")
*/
protected $createdAt;
/**
* @var DateTime
*
* @ORM\Column(name="updated_at", type="datetime")
*/
protected $updatedAt;
// ...
/**
* @ORM\PrePersist
*/
public function onPrePersist()
{
$this->createdAt = new DateTime();
$this->updatedAt = new DateTime();
}
/**
* @ORM\PreUpdate
*/
public function onPreUpdate()
{
$this->updatedAt = new DateTime();
}
}