2012-03-02 50 views
0

我有2個實體,一個作爲一個主要的超類,由辨別器等組成,另一個擴展了這個超類......這樣我就可以記錄所有的動作一個名爲Action的表。原則2鑑別器繼承映射導致findBy方法不起作用

我discrimator實體:

namespace Entities\Members; 

/** 
* @Entity 
* @Table(name="actions") 
* @MappedSuperClass 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="action_type", type="string") 
* @DiscriminatorMap({"comments" = "Comments", "blog" = "Blog"}) 
* @HasLifecycleCallbacksIndex 
*/ 
class Action { 

    /** 
    * @Id 
    * @Column(name="id", type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** @Column(type="string", length=300, nullable=true) */ 
    public $name; 

    /** @Column(name="action_date", type="datetime", columnDefinition="datetime", nullable=false) */ 
    protected $action_date; 

    /** @PrePersist */ 
    public function updated() { 
     $this->action_date = new \DateTime("now"); 
    } 

} 

這是我的一個實體,我使用延長上述discrimator實體:

namespace Entities\Members; 

/** 
* @Entity 
* @Table(name="comments") 
* @HasLifecycleCallbacks 
*/ 
class Comments extends Action { 

    /** 
    * @Id @Column(name="id", type="bigint",length=15) 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** @Column(name="blog_id", type="integer", nullable=true) */ 
    protected $blog_id; 

    /** @Column(name="comment", type="string", length=255, nullable=true) */ 
    protected $comment; 

    /** @Column(name="comment_date", type="datetime", columnDefinition="datetime", nullable=true) */ 
    protected $comment_date; 

    /** 
    * @ManyToOne(targetEntity="Members",inversedBy="comments", cascade={"persist"}) 
    * @JoinColumn(name="userid", referencedColumnName="id") 
    */ 
    protected $author; 


    public function __construct() { 
     $this->comment_date = $this->comment_date = new \DateTime("now"); 
    } 

} 

這個工作得很好,當我堅持的意見實體,例如

$entity = new Entities\Comments; 
$entity->comment = "my new comment"; 
$this->em->persist($entity); 
$this->em->flush(); 

當我堅持下去,它成功地增加了動作到動作表...

但是,我不能使用任何findBy,findByOne方法了,,從這些方法中的任何結果的返回值= null 現在,當我編輯評論類,並刪除'延伸從行動',學說findby,findOneBy方法開始工作 ,但它不會添加到tmy鑑別表,因爲它不擴展主操作超類...

我需要它來擴展動作,並有學說的方法蘇ch找到,findOneBy等工作也...

有什麼建議嗎?

回答

0

請發表您的查詢代碼。我有興趣看到這一切如何工作,所以我複製你的實體,然後做了一個查詢:

protected function testJoinedQuery() 
{ 
    $em = $this->getEntityManager(); 
    $repo = $em->getRepository('Entity\Comments'); 

    $entity = $repo->findOneBy(array('id' => 2)); 

    echo get_class($entity) . ' ' . $entity->getComment() . "\n"; 

} 

似乎工作得很好。你是否試圖使用Actions回購?

你可能不會需要這樣的:

  • @MappedSuperclass

而擁有它似乎並沒有傷害任何東西。

+0

nope ..當我做get_class($實體)時,它打印出此代碼的實際類名.. BaseController?但如果我刪除'擴展活動'它打印出實體/評論,所以它的工作原理,如果你不擴大行動.. – 2012-03-05 12:21:46

+0

張貼您的查詢代碼。 – Cerad 2012-03-05 13:46:38

+0

它和你的一樣:$ repo = $ this - > _ em-> getRepository('Entities \ Comments'); $ entity = $ repo-> findOneBy(array('name'=>'bars')); // $ entity = $ repo-> findOneById(233); echo get_class($ entity)。 ''。 $ entity-> id。 「\ n」 個;我試了兩個,你可以看到上面... findOneById和findOneBy(數組)我認爲它的ID是與所有擴展它的實體衝突....(操作ID字段) – 2012-03-05 18:16:10