如何更新Symfony2中的单向ManyToMany映射?

时间:2012-08-13 16:47:28

标签: symfony doctrine

我一直在寻找答案几个小时,我自己找不到一个干净的解决方案。

我有一个名为“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。

我的整体问题是:为什么这种方式适用于插入,但不适用于更新?我该怎么做才能解决这个问题?

非常感谢您的帮助或任何提示!!

0 个答案:

没有答案