2015-05-31 2 views
2

У меня есть эта модель; Маршрут, место проведения, маршрут.Удаление элементов OneToMany, Doctrine2

Мне нужно было много-много отношений между маршрутами и местами, но также я хотел хранить некоторые конкретные данные о связи (например, заметки, собственные фотографии и т. Д.), Поэтому я решил ввести новый объект с именем ItineraryVenue.

Так что в маршруте есть коллекция маршрутов, которые, в свою очередь, относятся к местам.

Моя проблема заключается в том, что я не могу удалить ItineraryVenue из объекта Маршрут.

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

удаляет элемент из коллекции php, но не удаляет этот $ маршрут из базы данных.

Мне удалось заставить Doctrine2 удалить $ itineraryVenue, но только когда я комментирую Itinerary::$itineraryVenues с orphanRemoval=true.

Поскольку удаление сирот рассматривается как место частной собственности, оно также удаляет объект объекта, я не хочу этого.

Есть ли вариант конфигурации отношений или удаляет «вручную» оливковый способ заставить его работать так, как я хочу?

Трудно поверить, это шаблон общего отношения.

Entities определения:

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.

Смежные вопросы