我一直在寻找答案几个小时,我自己找不到一个干净的解决方案。
我有一个名为“Tag”的实体。您可以将这些标签添加到几乎所有内容中,例如。一篇文章,一则新闻等。因此,我的entites(在这个例子中是一篇文章)引用了具有单向ManyToMany映射的这些标记:
/**
* @ORM\ManyToMany(targetEntity="Tag")
* @ORM\JoinTable(name="tag2article",
* joinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
* )
*/
private $tags;
这种关系是单向的,因为那时我不希望有一个articleTag,newsTag等或几个实体作为joinTables。该学说手册称单向ManyToMany关系“不太常见”,因为您可以使用额外的joinTableEntity构建3个实体之类的关系。但这会导致太多这类实体。
创建文章时,这些标记会添加:
foreach ($tagArray as $tagId) {
$tag = $entityManager->getRepository('myBundle:Tag')->findOneById($tagId);
if ($tag != null) {
$article->addTag($tag);
}
}
$entityManager->persist($article);
$entityManager->flush();
这在插入时工作正常。在更新时我也这样做,但它不起作用,我不知道为什么。我发现的唯一解决方案是将这篇文章添加到标记中,但这是不可能的,尽管我正在使用单向关系。
在我的ArticleForm中,我只有一个隐藏的字段:
->add('tags', 'hidden', array(
'data' => '',
'property_path' => false
))
通过这种方式,我可以使用Ajax轻松添加标签,并在这个隐藏字段中写下这些tagIds。
我的整体问题是:为什么这种方式适用于插入,但不适用于更新?我该怎么做才能解决这个问题?
非常感谢您的帮助或任何提示!!