Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogeneradas

Estas en el tema de Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogeneradas en el foro de Symfony en Foros del Web. Estoy creando mi primer proyecto con Symfony y por ahora no he tenido problemas más allá de las tipicas tonterias que nos puden surgir cuando ...
  #1 (permalink)  
Antiguo 09/05/2013, 01:02
 
Fecha de Ingreso: diciembre-2011
Mensajes: 134
Antigüedad: 12 años, 10 meses
Puntos: 5
Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogeneradas

Estoy creando mi primer proyecto con Symfony y por ahora no he tenido problemas más allá de las tipicas tonterias que nos puden surgir cuando tocamos cualquier metodologia nueva.

Todo iba bien hasta que se me ha planteado un imprevisto que no veo solucion posible.


Tengo una relacion muchos a muchos. (receta - alimento ) y la tabla intermedia se ha generado automaticamente cuando he diseña la base de datos con el ORM.

Por lo tanto yo tengo mi base de datos con mi tabla receta, mi tabla alimento y mi tabla autogenerada y llamada receta_alimento .

Para cargar estas tablas gasto Fixtures. Genero los php de las fixtures y los asocio con sus respectivos entidades. Por ejemplo recetas.php (fixtures) ira asociado con receta.php, y asi podre crear el objeto recetas dentro del archivo de los fixtures(recetas.php) para cargarlo y subirlo a la base de datos.


El problema es que la clase receta_alimento no existe (la tabla se autogenera al definir la relacion como muchos a muchos) , por lo tanto no puedo cargar un objeto RecetaAlimento para rellenarlo con las fixtures.

¿que puedo hacer ?


conclusion y resumen: no puedo (o no se) cargar las clases intermedias autogeneradas cuando relacionamos entidades muchos a muchos , con el metodo de los fixtures.
  #2 (permalink)  
Antiguo 09/05/2013, 05:50
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

El manejo de la tabla intermedia es transparente, solo debes agregar a la receta los alimentos y Doctrine se encargara del resto.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 10/05/2013, 01:18
 
Fecha de Ingreso: diciembre-2011
Mensajes: 134
Antigüedad: 12 años, 10 meses
Puntos: 5
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Cita:
Iniciado por masterpuppet Ver Mensaje
El manejo de la tabla intermedia es transparente, solo debes agregar a la receta los alimentos y Doctrine se encargara del resto.

Saludos.
Gracias. No he conseguido que funcione, no consigo que las fixtures cargen las tablas intermedias autogeneradas, pero si me dices que se puede hacer al menos se que debo seguir por ese camino.


Seguire intentadolo y cuando lo consiga lo subo para que otros con mi mismio problema pueda ver la solucion.
  #4 (permalink)  
Antiguo 13/05/2013, 23:17
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 15 años, 3 meses
Puntos: 23
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Pues yo tenia un problema similar, pero opte por crear una tabla intermedia yo mismo, tenia candidatos y suscripciones y cree una tabla intermedia con un id autonumerico y el id de candidato y el id de suscripciones y la respectiva relacion para cada lado.


Saludos
  #5 (permalink)  
Antiguo 15/05/2013, 03:42
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 4 meses
Puntos: 165
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Eso se hace de forma "transparente" como te han comentado. Doctrine 2 se encarga de esa parte, tu sólo trabajarás con atributos.

Si no voy mal encaminado, ahora la entidad será un atributo receta->alimento[] y alimento->receta[]

Un saludo!
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #6 (permalink)  
Antiguo 15/05/2013, 07:05
 
Fecha de Ingreso: diciembre-2011
Mensajes: 134
Antigüedad: 12 años, 10 meses
Puntos: 5
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Hoy he vuelto a retomar el tema y al ver que no conseguia sacarlo he optado por lo comentado por fhederico .... cual es mi sorpresa cuando veo que asi tampoco puedo ya que me salen errores al cargar la tabla intermedia y me dice lo siguiente.


Cita:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '14-6' for key 'PRIMARY'

Estoy por coger un bate de beisbol y romper el ordenador, a ver si acabo con el problema de raiz, ya que esta empezando a quemarme mucho el tema.


Ahora me veo ante dos opciones ... tirar por el comino que he tomado solucionando el problema que me ha salido o volver al camino anterior y seguir indagando ...


Conclusiones.

¿ Me aconsejais retomar el viejo sistema o no importa si lo hago creando las entidades para crear las tablas intermedias ?

¿Alguien sabe a que es debido este nuevo problema que me surge ?


gracias. a todos. espero no ser mucho mas pesado. pero la verdad que me esta sacando de quicio este problema de autogenerar las claves intermedias .
  #7 (permalink)  
Antiguo 15/05/2013, 08:01
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 4 meses
Puntos: 165
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Buenas de nuevo,

¿Como generas las entidades? supongo que con ingeniería inversa en doctrine:

$ php app/console doctrine:mapping:import NombreBundle annotation

getters y setters con:

$ php app/console generate:doctrine:entities NombreBundle

Entonces, puedes ver que te genera? mira que getters y setters tienes, porque deberías de tenerlo todo de forma automática

Un saludo!
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #8 (permalink)  
Antiguo 15/05/2013, 08:10
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 4 meses
Puntos: 165
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Mira, este es un ejemplo de un setter de uno a muchos:

Código PHP:
Ver original
  1. public function addJobsCategorie(...\Entity\JobsCategories $jobsCategories)
  2.     {
  3.         $this->jobsCategories[] = $jobsCategories;
  4.    
  5.         return $this;
  6.     }

Dentro del fichero de las fixtures, haces un:

use ...\Entity\Receta; o de alimento según el caso?

Creo que el problema puede estar en que no tienes que hacer un fichero de fixtures para la tabla intermedia, si no más bien, primero cargas Recetas o Alimentos, y luego, el otro con la relación que toque. El orden es importante, creo que por defecto es por orden alfabético, aunque lo puedes modificar con:

Código PHP:
Ver original
  1. public function getOrder()
  2.       {
  3.            return 1;
  4.       }
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #9 (permalink)  
Antiguo 15/05/2013, 08:11
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 4 meses
Puntos: 165
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Mira, este es un ejemplo de un setter de uno a muchos:

Código PHP:
Ver original
  1. public function addJobsCategorie(...\Entity\JobsCategories $jobsCategories)
  2.     {
  3.         $this->jobsCategories[] = $jobsCategories;
  4.    
  5.         return $this;
  6.     }

Dentro del fichero de las fixtures, haces un:

use ...\Entity\Receta; o de alimento según el caso?

Creo que el problema puede estar en que no tienes que hacer un fichero de fixtures para la tabla intermedia, si no más bien, primero cargas Recetas o Alimentos, y luego, el otro con la relación que toque. El orden es importante, creo que por defecto es por orden alfabético, aunque lo puedes modificar con:

Código PHP:
Ver original
  1. public function getOrder()
  2.       {
  3.            return 1;
  4.       }
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #10 (permalink)  
Antiguo 15/05/2013, 09:23
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Como comente antes no es necesaria la entidad intermedia, esta se suele crear cuando quieres agregar propiedades, lo que debes comprobar es primero que el mapeo sea correcto, luego que estas actualizando correctamente el inverse side de la relación y que la persistencia en cascada si es necesaria este seteada correctamente.

Sobre el error último que muestras, eso ya es un tema de las restricciones que has definido en la tabla relacionada.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 15/05/2013 a las 09:32
  #11 (permalink)  
Antiguo 17/05/2013, 01:37
 
Fecha de Ingreso: diciembre-2011
Mensajes: 134
Antigüedad: 12 años, 10 meses
Puntos: 5
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Gracias a todos. Al final segui con la idea de fhederico (la de crear las entidades de las tablas intermedias ) y ya me fuciona. No me gusta nada esta solucion, hubiese preferido sacarlo usando el potencial de Doctrine, pero no me es posible perder mas tiempo en este punto.


Respecto al problema que me surgio lo comento por si alguien con el mismo fallo llega hasta aqui.


Cita:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '14-6' for key 'PRIMARY'
Vereis. Esto viene a decir que estamos duplicando el valor de una fila. Cuando tenemos tablas intermedias que se generan para conectar tablas muchos a muchos, esto es necesario, pero no pasa nada porque la clave primaria es una clave compuesta.


Me explico.

En una tabla muchos a muchos entre usuarios y alimentos tendriamos

pepe | manzanas
juan |manzanas
pepe | peras

Pepe y manzanas se repiten . No pasa nada porque la clave primaria es compuesta (pepemanzanas , juanmanzanas) pero al subir las fixtures te saldra un error porque se esta interpretando que hay valores de la misma columna que se repiten. Esto es debido a la restrinccion Unique, que impide que las claves ajenas se repitan, y en realidad nosotros tenemos 2 claves ajenas (pepe y manzanas) que sumammos para crear una propia y poder comunicar entre las tablas muchos a muchos.

Para solucionarlo debeis crear la base de datos indicandole Unique = false.

Código:
/**
    * @ORM\Id
    * @ORM\ManyToOne(targetEntity="Usuario")
    * @ORM\JoinColumn(name="usuario_id", referencedColumnName="id" , unique=false)
    */
    protected $usuario;
   
    /** 
    * @ORM\Id
    * @ORM\ManyToOne(targetEntity="Alimento") 
    * @ORM\JoinColumn(name="alimento_id", referencedColumnName="id", unique=false)
    *
    */
    protected $alimento;


Saludos.
  #12 (permalink)  
Antiguo 17/05/2013, 03:22
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 4 meses
Puntos: 165
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Disculpa mi insistencia.. pero sigo sin entender porqué crear la entidad intermedia...

Un saludo!
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #13 (permalink)  
Antiguo 19/05/2013, 05:37
 
Fecha de Ingreso: diciembre-2011
Mensajes: 134
Antigüedad: 12 años, 10 meses
Puntos: 5
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Cita:
Iniciado por miktrv Ver Mensaje
Disculpa mi insistencia.. pero sigo sin entender porqué crear la entidad intermedia...

Un saludo!
porque era incapaz de cargar los datos de las fixtures.


el esquema me lo creaba sin dificultad, pero a la hora de cargar las fixtures no podía hacerlo.

por ejemplo, si tenemos las tablas alimentos y usuarios y se autogenera la tabla intermedia alimentos_usuarios.

supongo que para cargar esta tabla intermedia se deberán cargar los id de usuario mediante las fixtures de alimentos y viceversa ( las id de alimentos desde las fixtures de usuarios) . pero ya digo que no podía hacerlo.
  #14 (permalink)  
Antiguo 19/05/2013, 07:13
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 4 meses
Puntos: 165
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Yo intenté hacerlo, y di con la siguiente forma, espero que te pueda servir.

El primer paso es importar la clase AbstractFixture.

Código PHP:
Ver original
  1. use Doctrine\Common\DataFixtures\AbstractFixture;

Extiendes la clase del fixture:

Código PHP:
Ver original
  1. class LoadUsuariosAndAlimentos extends AbstractFixture {


Después, importas las librerías de tus entidades que formarían parte de la relación, por ejemplo alimentos y usuarios.

Después, haces un método para cargar usuarios, y a cada entidad de usuario, le asignas una referencia interna para el fixture:


Código PHP:
Ver original
  1. public function loadUsuarios(ObjectManager $manager) {
  2.  
  3.    $Entity = new Usuario();
  4.    $Entity->setName('Juan');
  5.    ...
  6.    $manager->setReference('Juan', $Entity);
  7.    $manager->persist($Entity);
  8.    $manager->flush();
  9.  
  10. }

Como puedes ver creas una referencia interna para el manager que después usarás.

A continuación, el método de los alimentos:

Código PHP:
Ver original
  1. public function loadAlimentos(ObjectManager $manager) {
  2.  
  3.    $Entity = new Alimento();
  4.    ...
  5.    $Entity->setUsuario($this->getReference('Juan'));
  6.    ...
  7.  
  8. }

Y por último, en el método load, llamas a los dos métodos anteriores en el orden correcto:

Código PHP:
Ver original
  1. public function load(ObjectManager $manager) {
  2.         $this->loadUsuarios($manager);
  3.         $this->loadAlimentos($manager);
  4.     }
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #15 (permalink)  
Antiguo 21/05/2013, 01:04
 
Fecha de Ingreso: diciembre-2011
Mensajes: 134
Antigüedad: 12 años, 10 meses
Puntos: 5
Respuesta: Problema con Symfony2 y la carga de Fixtures en tablas intermedias autogen

Gracias, lo tendre en cuenta en proyectos futuros.

Etiquetas: frameworks-y-php-orientado-a-objetos, php, symfony2, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:16.