我已经寻找了几个小时的答案,但我自己找不到一个干净的解决方案。
我有一个名为“标签”的实体。您可以将这些标签添加到几乎所有内容中,将 fe 添加到文章、新闻等等。因此我的实体(在本例中是一篇文章)使用单向多对多映射来引用这些标签:
/**
* @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。教义手册将单向多对多关系称为“不太常见”,因为您可以使用附加的 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 添加标签并将这些 tagId 写入此隐藏字段中。
我的总体问题是:为什么这种方式适用于插入,但不适用于更新?我能做些什么来解决这个问题?
非常感谢您的帮助或任何提示!