使用附加字段删除多对多

时间:2013-06-20 03:29:00

标签: symfony doctrine-orm

我有2个具有n-n关系的实体。参考实体有一些额外的字段,所以我必须改变3个实体之间的关系。

User --(1-n)-- UserAddress --(n-1)-- Address

在用户实体中,我有一个到UserAddress的映射:

<one-to-many target-entity="UserAddress" mapped-by="user" field="addresses">
   <cascade>
     <cascade-all/>
    </cascade>
</one-to-many>

我的用户实体:

protected $addresses;

public function addAddress(UserAddress $address)
{
    $this->addresses[] = $address;

    return $this;
}

public function removeAddress(UserAddress $address)
{
    $this->addresses->removeElement($address);
}

public function getAddresses()
{
    return $this->addresses;
}

public function __construct()
{
    $this->addresses = new ArrayCollection();
}

当我尝试通过 $ user-&gt; removeAddress($ address)从用户地址集合中删除地址时,请重新检查$ addresses数组并删除该地址。但在数据库中它仍然存在。我希望删除数据库中的2个字段,一个在UserAddress表中,一个在Address中。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

$user->removeAddress($address)仅从ArrayCollection中删除元素。

从ArrayCollection中删除后,您必须在EntityManager中保留您的实体,然后刷新您的EntityManager。然后,您可以在数据库中看到一些更改。

在该操作之后,您可以看到已删除UserAddress表中的记录。要从地址中删除记录,您必须使用级联ORM规则声明链接到地址表的foreign_key。您制作一个级联规则(用户 - >用户地址)但现在您还需要一个(用户地址 - &gt;地址)

答案 1 :(得分:0)

您可以在UserAddress类中的字段上定义级联:

/** @OneToMany(targetEntity="Address", mappedBy="address", cascade={"remove"}) */
protected $addresses;

有关详细信息,请参阅this