2012-01-16 9 views
4

Я сойду с ума.Удаление детской коллекции от родителя

Это родитель:

class Parent { 
    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="integer") 
    */ 
    protected $id; 

    /** 
    * @OneToMany(targetEntity="Core\Parent\Child", mappedBy="parent", cascade={"persist", "remove"}) 
    */ 
    protected $children; 


    public function __construct() { 
     $this->children = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 


    public function getChildren() { 
     return $this->children->toArray(); 
    } 

    public function removeAllChildren() { 
     $this->children->clear(); 
    } 

    public function addChild($child) { 
     $this->children->add($child); 
    } 
} 

Это ребенок:

class Child { 
    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="integer") 
    */ 
    protected $id; 

    /** 
    * @ManyToOne(targetEntity="Core\Parent", inversedBy="children") 
    * @JoinColumn(name="parent_id", referencedColumnName="id") 
    */ 
    protected $parent; 
} 

Что не работает для меня является удаление всех существующих детей для этого родителя. Из моего контроллера я:

$parent = $em->getRepository('Core\Parent')->find(1); 
$parent->removeAllChildren(); 

На данный момент, я могу назвать getChildren() и пусто. Прежде чем мой скрипт завершает работу, я также делаю следующее: $em->flush();

Однако я проверяю таблицы базы данных, и данные все еще там! Я не понимаю, и это сводит меня с ума. Как удалить всех существующих дочерних элементов для этого родителя?

ответ

8

Вы должны использовать опцию Orphan Removal, например

/** 
* @OneToMany(
* targetEntity="Core\Parent\Child", 
* mappedBy="parent", 
* orphanRemoval=true, 
* cascade={"persist", "remove"} 
*) 
*/ 
protected $children; 
+0

OMG, спасибо! Это оно. – Vic

+0

Но 'orphanRemoval = true' будет работать только в том случае, если у ребенка нет других ссылок на него. Когда вы добавите дополнительную ссылку, это больше не будет работать. – tobain

-1

Вы могли бы:

$parent = $em->getRepository('Core\Parent')->find(1); 
foreach($parent->getChildren() as $child) { 
    $em->remove($child); 
} 
$parent->removeAllChildren(); 
$em->flush(); 
Смежные вопросы