2012-03-12 68 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