1

为了简单起见,假设我有两个具有一对多关系的对象:

用户 --(1:n)--> 请求

用户定义为

class User {
...
/** @OneToMany(targetEntity="Request", mappedBy="user", cascade={"all"}) */
   private $request;
...
}

和请求定义为

class Request {
...
/** @ManyToOne(targetEntity="User", inversedBy="request", cascade={"persist"}) */
    private $user;
...
}

是否可以创建一种方法来用户实体中删除与用户关联的所有请求?

我需要的是这样的:

class User {
....
    public function removeAllMyRequests() {
        foreach ($this->getAllMyRequests() as $req)
            $this->em->remove($req);
    }
....
}

但显然我不应该从实体内部调用实体管理器。

4

2 回答 2

1

您可以使用"Orphan Removal"标记关联:

/** 
 * @Entity 
 */
class User
{
    /** 
     * @OneToMany(
     *   targetEntity="Request",
     *   mappedBy="user", 
     *   cascade={"all"}, 
     *   orphanRemoval=true
     * ) 
     */
    private $requests;
}

从集合中移除的任何Request对象User#requests都将被标记为在下一次EntityManager#flush()调用期间移除。

要一次删除所有项目,您可以简单地使用Doctrine\Common\Collections\Collection#clear()

public function removeAllMyRequests() {
    $this->requests->clear();
}
于 2013-02-25T14:34:58.860 回答
0

我认为您正在寻找“级联”选项:http ://docs.doctrine-project.org/en/2.0.x/reference/working-with-associations.html#transitive-persistence-cascade-operations

于 2013-02-25T12:17:34.773 回答