2012-06-25 17 views
5

Después de fusionar una entidad que tiene entidades relacionadas con relaciones establecidas en cascada, tanto las operaciones de persistencia como las de combinación se pierden.Doctrine 2.1 - Relación perdida después de la fusión en cascada de ManyToMany - Symfony2

Estas son las entidades:

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

Aquí están mis une:

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

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

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

Aquí está mi código de fusión:

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

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

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

... y aquí está la salida:

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

..y la base de datos es el siguiente:

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

¿Alguien puede ver donde estoy siendo tonta?

BTW hay más relaciones que esta. He simplificado las cosas aquí para aclarar la explicación. Mis otras relaciones no se ven negativamente afectadas por la fusión. También estoy haciendo la fusión en una consola Command no en un controlador. Me pueden enviar más de código si que va a ayudar :)

También estoy usando Doctrina 2.1.7 y 2.0.15 Symfony

Muchas gracias, Mateo

+0

La documentación ORM doctrina recomiendan utilizar los bienes protegidos en lugar de una privada, en un caso de fusión. Creo que vale la pena intentarlo. Además, ¿por qué estás usando fusionar? – AdrienBrault

Respuesta

1

encontré el mismo problema y después de pensar algunos minutos probé una simple idea, simplemente cambie el orden del código y trate la fusión como nueva instancia de la entidad, descubro que la acción de fusión puede eliminar las relaciones, entonces:

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

Su trabajo para mí.

Espero que ayude.

3

He enfrentado el mismo problema, y ​​lo arreglaron mediante la actualización de la entidad después de combinación:

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