2013-06-20 57 views
0

我有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(); 
} 

当我试图通过$用户删除从用户的地址收集的地址 - > removeAddress($ address),重新检查$地址数组,该地址已被删除。但在数据库中它仍然存在。我期望删除数据库中的两个字段,一个在UserAddress表中,另一个在Address中。我怎样才能做到这一点?

回答

0

$user->removeAddress($address)只从ArrayCollection中移除元素。

从ArrayCollection中删除后,您必须将您的实体保存在EntityManager中,然后刷新您的EntityManager。然后你可以在你的数据库中看到一些变化。

完成该操作后,您可以看到UserAddress表中的记录已被删除。要从地址删除记录,您必须声明您的foreign_key链接到具有级联ORM规则的地址表。你让一个级联规则(用户 - > UserAddress),但现在,你还需要一个(UserAddress - >地址)

0

你可以在类UserAddress领域定义级联:

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

对于阅读更多信息this

+0

很简单cascade = {“remove”}两者都不够? – user1954544

+0

是的,那是真的 – Flow