1

我已经寻找了几个小时的答案,但我自己找不到一个干净的解决方案。

我有一个名为“标签”的实体。您可以将这些标签添加到几乎所有内容中,将 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 写入此隐藏字段中。

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

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

4

0 回答 0