我的应用程序中有一个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。我还希望已保存的标签可以在另一个字段中选择,这就是为什么我让这些实体以这种方式构建。
我试着写这个,但是真的与糟糕的代码混淆了,所以我甚至都没有尝试复制我的内容。有人可以简单地告诉我,我该如何做到这一点?
由于
答案 0 :(得分:4)
您不需要Post
和Tag
之间的中介实体。几个月前我自己努力让它工作,但在仔细阅读Many-To-Many, Unidirectional后,我设法做到了。
重点是,您不能创建Many-To-One
和One-To-Many
关系,只能创建一个Many-To-Many
。
关于嵌入表单,一旦您在Many-To-Many
和Post
之间建立Tag
关系,您就需要使用collection
字段表单类型。基本上,您会说:"好的,我的表单中包含Post
字段,其中很多 Tags
。
当然,我建议您尝试手动管理数据(持久,更新,删除),然后再尝试使用表单。如果您的模型中存在错误,那么找到问题的根源会更加困难,因为表单本身可能很棘手。
官方Symfony文档对此有一个很好的article,但是,我必须说,对于一个Symfony初学者来说,它有点压倒性,因为我正处于阅读它的时候。