2012-03-12 54 views
0

我的應用程序中有一個Post和Tag實體,我需要它們之間的多對多關聯。我認爲我是對的,但不是很確定。這裏是我的實體:Symfony2 ManyToMany嵌入表格

帖子:

/** 
* @ORM\Table(name="posts") 
*/ 
class Post 
{ 
    (...) 

    /** 
    * @ORM\OneToMany(targetEntity="PostTag", mappedBy="post_id") 
    */ 
    private $tags; 

    public function __construct() 
    { 
    $this->tags = new ArrayCollection(); 
    } 

    (...) 
} 

標籤:

class Tag 
{ 
    /** 
    * @ORM\Column(name="tagname", unique=true, type="string", length=255) 
    */ 
    private $tagname; 

    /** 
    * @ORM\OneToMany(targetEntity="PostTag", mappedBy="tag_id") 
    */ 
    private $posts; 

    public function __construct() 
    { 
     $this->posts = new ArrayCollection(); 
    } 

    (...) 
} 

我還創建了一個PostTag實體來存儲這些關係:

/** 
* @ORM\Table(name="post_tags") 
* @ORM\Entity 
*/ 
class PostTag 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Post", inversedBy="tags") 
    * @ORM\JoinColumn(name="post_id", referencedColumnName="id") 
    */ 
    private $post_id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Tag", inversedBy="posts") 
    * @ORM\JoinColumn(name="tag_id", referencedColumnName="id") 
    */ 
    private $tag_id; 

    (...) 
} 

當然,所有3與適當的獲得者/設定者。這種關係好嗎?

我相信我是不是正確的,但我現在努力使對郵政實體嵌入的形式。我需要的是,在PostType中創建一個標籤字段,其中可以輸入保存在標籤表中的標籤以及新創建的標籤和post_tags表中的帖子的標識。我也希望已保存的標籤可以在另一個字段中選擇,這就是爲什麼我要用這種方式構建實體。

我試着寫這一點,但確實得到了不好的代碼混淆,所以我甚至不試圖複製我有什麼。有人能簡單地啓發我,我應該如何實現這一目標?

感謝

回答

3

你不需要PostTag之間的中介實體。我自己努力讓它在幾個月前工作,但仔細閱讀Many-To-Many, Unidirectional後,我設法做到了。

重點是你不要創建Many-To-OneOne-To-Many關係,但一個Many-To-Many

關於嵌入表單,一旦你建立PostTag之間Many-To-Many關係,你需要使用collection場形狀類型。基本上,你會說:「好吧,我有了的Post領域可以有很多Tags形式

當然,我會建議你嘗試手動管理數據(持續,更新,刪除)在試圖使它與表單一起工作之前,如果你的模型有錯誤,找到問題的根源將會困難得多,因爲表單本身可能會很棘手。

官方Symfony文檔有一個很好的article這一點,雖然,我必須說,這是一個初學者的Symfony有點勢不可擋,因爲我是在閱讀它的時候。

+1

謝謝你我NPUT。我的問題是,我真的不想做出真正的多對多關係。如果我這樣做,我不能將任何字段或格式添加到該表中,而我真的不喜歡那樣。即使您鏈接的學說文檔也表明,最好的做法是創建一箇中間實體,並在這三個實體之間建立一對多,多對一的關係。感謝您的表單收藏提示! – stamas 2012-03-12 21:04:45

+0

我到最後解決了這個問題。 – stamas 2012-03-21 20:37:39