4

モデルで Doctrine の 2 つの概念を使用します。

  • クラステーブルの継承
  • ライフサイクル コールバック

親クラスの継承されたインスタンスをロードすると、データベースの親クラス テーブルにある値ではなく、ライフサイクル コールバックで更新される親プロパティが間違っています。

親 {abstract} クラス: ユーザー

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 プロパティをデバッグすると、値が2016-06-01 12:00:00日付ではなく、に対応する DateTime オブジェクトであることが期待されます...

継承の読み込みにも関係していますか? それがどこから来たのかわかりません。

4

1 に答える 1

-1

あなたはクラスupdatedAtから来ることができます。クラスの で、 と を使用してデータをUser入力し__construct()ます。は作成時、および作成時または更新時に満たされるはずなので、それは悪い習慣だと思います。クラスをこれに更新してみてください(を削除します):User$this->createdAt = new DateTime()$this->updatedAt = new DateTime()createdAtUserupdatedAtUserUser__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();
    }
}
于 2017-02-08T10:20:40.640 に答える