2013-02-16 46 views
0

我有两个实体E1 & E2与ManyToMany关系和链接表为它。一切都很好,直到我试图添加到E2不存在的E1元素。例如,E2是标记实体。用户通过表单放置几个标签。 E2中如何在E2中添加不存在的标签?Symfony2(Doctrine):添加与M:M关系不存在的行

UPDATE:

好啦,我已经根据@Axxiss答案更新我的实体。它确实自动保留新标签,但它也会保留旧标签。我所要做的就是如果我有一个名称为'tag1'的标签,它不应该再次添加到标签表中。

+0

“不存在”是什么意思?你的意思是它已经创建但尚未被保存? – 2013-02-16 12:49:58

回答

1

您需要将cascade注释添加到E1中的标记字段。

里面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; 

检查Transitive persistence/Cascade Operations

如果你想添加一个标签只有一个时间,你有两种选择:

  1. 上做吧控制器在坚持实体之前
  2. 直接在实体上执行

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

+0

好吧,它现在坚持新的标签。但它坚持了很多次。我已经更新了我的问题,请看看它。 – Hast 2013-02-17 22:18:56

+0

而且您错过了'JoinColumn'中的两个右括号:) – Hast 2013-02-17 22:20:11

+0

括号修正,并添加了独特的标记响应 - – Axxiss 2013-02-18 17:54:16

1

如果你想要独特的标签,你需要检查它们是否存在之前坚持他们。

+0

好吧,我将通过dataTransformer将字符串'tag1,tag2,tag3'转换为Tag对象的ArrayCollection。我应该在哪里放置检查存在标签的查询?在其他地方的数据转换器本身? – Hast 2013-02-18 08:23:05

+0

放置查询的最佳位置是在Repository类中 – 2013-02-18 16:39:51