Php Symfony2(原则):使用M:M关系添加不存在的行

Php Symfony2(原则):使用M:M关系添加不存在的行,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我有两个实体E1和E2,它们有许多关系和链接表。在我尝试添加E2中不存在的E1元素之前,一切都很好。例如,E2是标记实体。用户通过表单放置两个标签。在将E2中不存在的标记持久化到E1之前,如何在E2中添加这些标记 更新: 好的,我已经根据@axxis-answer更新了我的实体。它会自动保留新标签,但也会再次保留旧标签。所有我需要做的是,如果我有一个名为“tag1”的标记,它就不应该再添加到标记表中。您需要在E1内的标记字段中添加cascade注释 在E1中,您将看到如下内容: /** * @

我有两个实体E1和E2,它们有许多关系和链接表。在我尝试添加E2中不存在的E1元素之前,一切都很好。例如,E2是标记实体。用户通过表单放置两个标签。在将E2中不存在的标记持久化到E1之前,如何在E2中添加这些标记

更新:


好的,我已经根据@axxis-answer更新了我的实体。它会自动保留新标签,但也会再次保留旧标签。所有我需要做的是,如果我有一个名为“tag1”的标记,它就不应该再添加到标记表中。

您需要在E1内的标记字段中添加
cascade
注释

在E1中,您将看到如下内容:

/**
 * @ORM\ManyToMany(targetEntity="Tag", cascade={"persist"})
 * @ORM\JoinTable(name="e1_has_tags",
 *      joinColumns={@ORM\JoinColumn(name="e1_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
 *      )
 **/
private $tags;
检查

如果只想添加一次标记,则有两个选项:

  • 在持久化实体之前,在控制器上执行此操作
  • 直接在实体上执行此操作

  • 在这两种情况下,您都需要按标记名进行查询,如果标记已经存在,请将其替换为找到的标记

    如果你想要唯一的标签,你需要先检查它们是否存在,然后再持久化它们。

    你说“不存在”是什么意思?你是说它已创建但尚未持久化?好的,它现在确实会持久化新标记。但它坚持了很多次。我已经更新了我的问题,请看。而且你在“JoinColumn”中漏掉了两个结束括号:)谢谢!我现在明白了。好的,我将字符串“tag1,tag2,tag3”通过dataTransformer转换为标记对象的ArrayCollection。我应该将检查标记是否存在的查询放在哪里?在其他地方的datatransformer中?最好将查询放在存储库类中