【问题标题】:Removing entities from another entity从另一个实体中移除实体
【发布时间】:2013-02-10 13:02:30
【问题描述】:

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

用户 --(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);
    }
....
}

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

【问题讨论】:

    标签: php orm doctrine-orm doctrine entitymanager


    【解决方案1】:

    【讨论】:

    • 我想简单的级联是不够的。两个实体都已经支持级联(cascade='persist', cascade='all')。我无权从 User 类访问实体管理器,因此我无法使用 $em->remove() 或 $em->persist() 方法。
    【解决方案2】:

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

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

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

    要一次删除所有项目,您只需使用Doctrine\Common\Collections\Collection#clear()

    public function removeAllMyRequests() {
        $this->requests->clear();
    }
    

    【讨论】:

    • 这正是我所需要的 :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多