Symfony2 ManyToMany嵌入式表单

时间:2012-03-12 18:29:54

标签: php doctrine symfony entity-relationship

我的应用程序中有一个Post和Tag实体,我需要它们之间的多对多关联。我认为我做得对,但不是很有把握。这是我的实体:

发表:

/**
* @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人都有适当的getter / setter。这种关系是否正常?

我相信我做对了,但现在我正努力为Post实体制作一个嵌入式表单。我需要的是,在PostType中创建一个标签字段,其中可以输入保存在标签表中的标签以及post_tags表中新创建的标签和帖子的id。我还希望已保存的标签可以在另一个字段中选择,这就是为什么我让这些实体以这种方式构建。

我试着写这个,但是真的与糟糕的代码混淆了,所以我甚至都没有尝试复制我的内容。有人可以简单地告诉我,我该如何做到这一点?

由于

1 个答案:

答案 0 :(得分:4)

您不需要PostTag之间的中介实体。几个月前我自己努力让它工作,但在仔细阅读Many-To-Many, Unidirectional后,我设法做到了。

重点是,您不能创建Many-To-OneOne-To-Many关系,只能创建一个Many-To-Many

关于嵌入表单,一旦您在Many-To-ManyPost之间建立Tag关系,您就需要使用collection字段表单类型。基本上,您会说:"好的,我的表单中包含Post字段,其中很多 Tags

当然,我建议您尝试手动管理数据(持久,更新,删除),然后再尝试使用表单。如果您的模型中存在错误,那么找到问题的根源会更加困难,因为表单本身可能很棘手。

官方Symfony文档对此有一个很好的article,但是,我必须说,对于一个Symfony初学者来说,它有点压倒性,因为我正处于阅读它的时候。