2012-06-25 5 views
5

Dopo la fusione di un'entità che ha entità correlate con relazioni impostate in cascata entrambe le operazioni persistono e uniscono le relazioni vengono perse!Doctrine 2.1 - Relazione persa dopo ManyMany Cascade Merge - Symfony2

Qui ci sono le entità:

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; 
} 

Ecco le mie unisce:

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

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

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

Ecco il mio codice di unione:

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

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

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

... e qui è l'output:

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

..e il database appare così:

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

Chiunque può vedere dove mi sto comportando muto?

BTW ci sono più relazioni di questo. Ho semplificato le cose qui per rendere più chiara la spiegazione. Le mie altre relazioni non sono influenzate negativamente dall'unione. Inoltre sto facendo l'unione in una console Comando non in un controller. Posso postare più di codice, se ti aiuto :)

Anche io sto usando Dottrina 2.1.7 e 2.0.15 Symfony

Molte grazie, Matthew

+0

La documentazione ORM dottrina consiglia di utilizzare le proprietà invece di una privata protetta, in un caso di fusione. Penso che valga la pena provare. Inoltre, perché stai utilizzando l'unione? – AdrienBrault

risposta

1

ho riscontrato lo stesso problema e dopo alcuni minuti ho provato a pensare in modo semplice, basta modificare l'ordine del codice e considerare l'unione come nuova istanza dell'entità, ho scoperto che l'azione di unione può rimuovere le relazioni, quindi:

$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(); 

Le sue opere per me.

Spero che aiuti.

3

Ho affrontato lo stesso problema, e riparato aggiornando l'entità dopo l'unione:

$mergedEntity = $entityManager->merge($serializedEntity); 
$entityManager->refresh($mergedEntity);