Php Symfony2(原则):使用M:M关系添加不存在的行
我有两个实体E1和E2,它们有许多关系和链接表。在我尝试添加E2中不存在的E1元素之前,一切都很好。例如,E2是标记实体。用户通过表单放置两个标签。在将E2中不存在的标记持久化到E1之前,如何在E2中添加这些标记 更新: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中,您将看到如下内容: /** * @
好的,我已经根据@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中?最好将查询放在存储库类中