4

私は私のモデルに教義の二つの概念を使用する上で誤った値を持っています親クラスのインスタンスでは、ライフサイクルコールバックで更新される親プロパティは間違っています。私のデータベースの親クラステーブルにある値ではありません。教義クラステーブル継承プロパティは、クエリ

親{抽象}クラス:ユーザーが

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(); 
    } 
} 

子クラス:メンバーコントローラここ

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? 
} 

に続い

/** 
* 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; 
    } 
} 

は私のデータベースの内容の抽出物である

// 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オブジェクトであることを期待

ではなく、その日の日付...

はロードを継承することも関係していますか? どこから来たのかわかりません。

+0

愚かな質問...なぜあなたは '$これを返します;'あなたのコンストラクタで? – yivi

答えて

-1

あなたのupdatedAtは、Userクラスから来る可能性があります。 Userクラスの__construct()には、$this->createdAt = new DateTime()$this->updatedAt = new DateTime()を使用してデータが入力されます。 createdAtUserの作成になり、updatedAtUserの作成または更新されているため、これは悪い習慣だと思います。 (__constructorを削除する)これにあなたのUserクラスを更新しよう:

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(); 
    } 
} 
+0

ありがとうRendyが原因ではありません。 1. Doctrineは、エンティティのロード時にエンティティコンストラクタを呼び出さず、データベース値からシリアル化されていません。これは、 '$ member = new Member();'のようなものを実行したときにだけ、アプリケーションによって呼び出されます。 2. PrePersistは '$ em-> persist($ member);'の呼び出しごとに呼び出されるので、更新ごとにcreatedAtタイムスタンプも確実に更新されます。 –

+0

待って、マップされたスーパークラス 'User'のテーブルをどうですか?マップされたスーパークラスは抽象クラスに過ぎず、エンティティ(テーブルも持てません)にすることはできません。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#mapped-superclassesを参照してください。 –

+0

マップされたスーパークラスを使用していませんが、クラステーブルの継承を使用しています。 Userクラス抽象化は、アプリケーションが意味をなさない 'User'インスタンスを作成するのを防ぐためのものです。 'Member'インスタンスか、私のモデルの他の' User'子クラスのいずれかが必要です。 –

関連する問題