Свойство наследования таблицы классов 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();
    }
}
Другие вопросы по тегам