Hola a todos, tengo una duda con unas fixtures que comparten objetos,
Tengo una primera fixture que carga lo que son las "Áreas de Conocimiento" ( he cambiado un poco el código para simplificarlo, pero creo que la idea se mantiene )
$areasConocimientos = new AreasConocimientos();
$areasConocimientos->setAreaConocimiento('Diseño');
$manager->persist ($areasConocimientos);
$this->addReference( 'Diseño', $areasConocimientos);
$areasConocimientos = new AreasConocimientos();
$areasConocimientos->setAreaConocimiento('Programacion');
$manager->persist ($areasConocimientos);
$this->addReference( 'Programacion', $areasConocimientos);
$areasConocimientos = new AreasConocimientos();
$areasConocimientos->setAreaConocimiento('Otro');
$manager->persist ($areasConocimientos);
$this->addReference( 'Otro', $areasConocimientos);
$manager->flush();
Ahora en una segunda fixture (getOrder = 2)
$areaConocimiento= array(
'Diseño' => array( 'Diseño 1', 'Diseño 2' ),
'Programación' => array( 'Programacion 1', 'Programacion'),
'Otro' => array( 'Otro 1', 'Otro 2' )
);
foreach( $areaConocimiento as $area => $programas ){
foreach( $programas as $programa ){
//El objeto programa ProgramasEstudios tiene un Id, un campo string y una Relacion ManyToOne con AreasConocimientos
$objProgramasEstudios = new ProgramasEstudios();
$objProgramasEstudios->setProgramasEstudios( $programa );
$objProgramasEstudios->setAreaConocimiento( $manager->merge( $this->getReference($area) ) );
$manager->persist( $objProgramasEstudios );
}
}
$manager->flush();
Si ejecuto el comando para cargar las fixtures todo funciona sin problemas al haber usado $this->addReference()... luego puedo llamarla $this->getReference($area), el problema esta en que quiero usar los "programas de estudios" como referencia para otra fixture que necesito, así que agrego esta línea
$this->addReference( $programa, $objProgramasEstudios);// debajo de $manager->persist( $objProgramasEstudios );
Cuando hago esto y trato cargar las fixtures obtengo el siguiente error:
[BadMethodCallException]
Reference to: (Diseño ) already exists, use method setReference in order to override it
Supongo (es a la conclusión que he llegado) que al crear la referencia del $objProgramasEstudios, como este a su vez contiene un objeto de tipo AreasConocimiento trata de crear una referencia de la misma tambien, pero como ya existe una (cuando se crearon en el primer fixture) da un error, si uso el metodo setReference como lo indica obtengo otro error $objProgramasEstudios->setAreaConocimiento( $manager->merge( $this->getReference($area) ) ); indicando que no estoy pasando un objeto de tipo AreaConocimiento sino uno Proxies\EstudiosBundleEntityProgramasEstudiosProxy
Alguien que me pueda ayudar :D