2012-06-25 15 views
5

Po połączeniu podmiotu, który ma powiązane podmioty z relacjami ustawionymi do kaskadowania zarówno operacji trwałych, jak i scalania, relacje są tracone!Doctrine 2.1 - Relacja utracona po ManyToMany Cascade Merge - Symfony2

Oto podmioty:

class Event implements NormalizableInterface 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Participant", inversedBy="events", cascade={"persist", "merge"}) 
    * @ORM\JoinTable(name="event_participant", 
    *  joinColumns={@ORM\JoinColumn(name="event_id", referencedColumnName="id", onDelete="CASCADE")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="participant_id", referencedColumnName="id", onDelete="CASCADE")} 
    *  ) 
    */ 
    private $participants; 
} 


class Participant implements NormalizableInterface 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Event", mappedBy="participants", cascade={"persist", "merge"}) 
    */ 
    protected $events; 
} 

Oto moje dołącza:

foreach ($events as $event) 
{ 
    if (!$event->hasParticipant($participant)) { 

     $event->addParticipant($participant); 
    } 
    if (!$participant->hasEvent($event)) { 

     $participant->addEvent($event); 
    } 
} 

Oto mój kod seryjnej:

echo "Before merge participant count: ".count($event->getParticipants()).PHP_EOL; 

$event = $em->merge($event); 

echo "After merge participant count: ".count($event->getParticipants()).PHP_EOL; 

... i tu jest wyjście:

Before merge participant count: 2 
After merge participant count: 0 

..i baza danych wygląda następująco:

table    | rows 
------------------------------- 
event    | 1 
------------------------------- 
participant   | 2 
------------------------------- 
event_participant | 0 
------------------------------- 

Czy ktoś może zobaczyć, gdzie mam być głupi?

BTW ma więcej związków niż to. Uprośniłem rzeczy tutaj, aby wyjaśnienie było jaśniejsze. Moje pozostałe relacje nie mają negatywnego wpływu na scalanie. Robię również scalanie w konsoli Polecenie nie w kontrolerze. Mogę pisać więcej kodu, jeśli to pomoże :)

Również używam Nauki 2.1.7 i 2.0.15 Symfony

Dziękujemy, Matthew

+0

Dokumentacja ORM doktryny zaleca się stosowanie chronionych własności prywatnej zamiast jednej, w przypadku scalania. Myślę, że warto spróbować. Ponadto, dlaczego używasz scalania? – AdrienBrault

Odpowiedz

1

Znalazłem ten sam problem i po przemyśleniu kilku minut próbowałem prostego przemyślenia, po prostu zmień kolejność kodu i potraktuj scalony jako nowe wystąpienie podmiotu, stwierdziłem, że akcja scalania może usuwać relacje, więc:

$user = new User(); 
$user->setName('name'); 
$user->setAge('24'); 

$mergedUser = $em->merge($user); 

// Imagine we have some groups to add 
foreach ($groups as $group) { 
    $mergedUser->addGroup($group); 
} 

$em->flush(); 

To działa dla mnie.

Mam nadzieję, że to pomaga.

3

Mam wobec tego samego problemu i naprawić go przez podmiot orzeźwiający po scaleniu:

$mergedEntity = $entityManager->merge($serializedEntity); 
$entityManager->refresh($mergedEntity); 
Powiązane problemy