2015-05-31 41 views
2

我有这个模型; 行程,地点,行程温馨。删除OneToMany元素,Doctrine2

我需要行程和场地之间的多对多关系,但我也想存储一些关于关系的特定数据(比如便条,自己的照片等),所以我决定引入一个名为ItineraryVenue的新实体。

所以Itinerary具有ItineraryVenues的集合,而ItineraryVenues又是指Venues。

我的问题是我无法从行程对象中删除ItineraryVenue。

$itinerary->itineraryVenues->removeElement($itineraryVenue); 
$em->flush(); 

从php集合中移除元素,但不会从数据库中删除此$ itineraryVenue。

我设法强制Doctrine2删除$ itineraryVenue,但只有当我注释Itinerary::$itineraryVenuesorphanRemoval=true

由于孤儿去除将Venue作为私人财产处理,因此它也删除了Venue实体,我不想那样做。

是否有关系配置选项或正在删除“手工”olny的方式,使其工作,因为我想?

很难相信它,它是一种常见的关系模式。

实体的定义:

class Itinerary 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="ItineraryVenue", mappedBy="itinerary", cascade={"persist", "remove"}) 
    */ 
    private $itineraryVenues; 

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

class ItineraryVenue 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Itinerary", inversedBy="itineraryVenues") 
    */ 
    private $itinerary; 
    /** 
    * @ORM\ManyToOne(targetEntity="Venue") 
    */ 
    private $venue; 

    function __construct() 
    { 
    } 
} 

class Venue 
{ 
} 

回答

0

你是做正确的事情:orphanRemoval - 是你所需要的。所以,你应该覆盖默认的行程:: removeItineraryVenue像

public function removeItineraryVenue(\AppBundle\Entity\ItineraryVenue $itineraryVenue) 
{ 
    $itineraryVenue->setItinerary(null); 
    $this->itineraryVenues->removeElement($itineraryVenue); 
} 

完整的工作示例在这里https://github.com/kaduev13/removing-onetomany-elements-doctrine2