Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/10/2012, 12:09
Avatar de portalmana
portalmana
 
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Relaciones con Doctrine 2

Hola, como estan todos, la idea es que tengo en mi base una tabla usuarios y otra perfiles.
Donde un usuario puede tener solo un perfil.
Pero un perfil puede tener muchos Usuarios asociados.
USUARIOS
Código SQL:
Ver original
  1. CREATE TABLE `usuarios` (
  2.     `usuario` VARCHAR(30) NOT NULL DEFAULT '',
  3.     `correo` VARCHAR(210) NOT NULL,
  4.     `nombre_usuario` VARCHAR(50) NOT NULL,
  5.     `clave` VARCHAR(50) NOT NULL,
  6.     `id_perfil` INT(50) NOT NULL,
  7.     PRIMARY KEY (`usuario`),
  8.     INDEX `FK_usuarios_perfiles` (`id_perfil`),
  9.     CONSTRAINT `FK_usuarios_perfiles` FOREIGN KEY (`id_perfil`) REFERENCES `perfiles` (`id_perfil`) ON UPDATE CASCADE
  10. )
  11. COMMENT='Modulo Autenticacion'
  12. COLLATE='utf8_general_ci'
  13. ENGINE=InnoDB;
PERFILES
Código SQL:
Ver original
  1. CREATE TABLE `perfiles` (
  2.     `id_perfil` INT(10) NOT NULL AUTO_INCREMENT,
  3.     `perfil` VARCHAR(50) NOT NULL,
  4.     PRIMARY KEY (`id_perfil`),
  5.     UNIQUE INDEX `perfil` (`perfil`)
  6. )
  7. COMMENT='Modulo Autenticacion\r\n'
  8. COLLATE='utf8_general_ci'
  9. ENGINE=InnoDB

Luego tengo las Entidades
Código PHP:
Ver original
  1. /**
  2.  * @Entity
  3.  * @Table(name="perfiles")
  4.  **/
  5. class Perfil
  6. {
  7.     /**
  8.      * @Id
  9.      * @GeneratedValue (strategy="AUTO")
  10.      * @Column(type="integer", name="id_perfil")
  11.      **/
  12.     protected $id;
  13.    
  14.     /** @Column(type="string", length=50) **/
  15.     protected $perfil;
  16.    
  17.     /**
  18.      * @OneToMany(targetEntity="Usuario", mappedBy="perfil", cascade={"persist"})
  19.      */
  20.     protected $usuarios;
  21.  
  22.     public function __construct()
  23.     {
  24.         $this->usuarios = new \Doctrine\Common\Collections\ArrayCollection();
  25.     }
  26.    
  27.     /**
  28.      * Agrego un Usuario al Perfil.
  29.      * @param \modulos\acceso\models\Usuario $usuario
  30.      */
  31.     public function addUsuario(Usuario $usuario)
  32.     {
  33.         $this->usuarios[] = $usuario;
  34.     }
Código PHP:
Ver original
  1. /**
  2.  * @Entity
  3.  * @Table(name="usuarios")
  4.  **/
  5. class Usuario
  6. {
  7.     /**
  8.      * @Id
  9.      * @Column(type="string", length=30)
  10.      **/
  11.     protected $usuario;
  12.    
  13.     /**
  14.      * @Column(type="string", length=210)
  15.      **/
  16.     protected $correo;
  17.    
  18.     /**
  19.      * @Column(type="string", length=50, name="nombre_usuario")
  20.      **/
  21.     protected $nombre;
  22.    
  23.     /**
  24.      * @Column(type="string", length=50)
  25.      **/
  26.     protected $clave;
  27.    
  28.     /**
  29.      * @OneToOne(targetEntity="Perfil", inversedBy="usuarios", fetch="EAGER")
  30.      * @JoinColumn(name="id_perfil", referencedColumnName="id_perfil")
  31.      */
  32.     protected $perfil;
  33.    
  34.     public function __construct()
  35.     {
  36.        $this->perfil = New \Doctrine\Common\Collections\ArrayCollection();
  37.     }
Cada clase con sus setters y getters.

La situacion es que Eliminar y Crear un nuevo Usuario lo realiza bien, el problema es cuando tengo que actualizar un nuevo usuario, me da el siguiente error:

Código PHP:
Ver original
  1. Mensaje : A new entity was found through the relationship 'modulos\acceso\models\Usuario#perfil' that was not configured to cascade persist operations for entity: modulos\acceso\models\Perfil@00000000404b9edd000000004c14202d. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist  this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'modulos\acceso\models\Perfil#__toString()' to get a clue.
Se supone que es un error en el mapeo de las entidades, pero he probado varias posibilidades y nada.

La pregunta es como seria el codigo correcto para actualizar con Doctrine o si, es solo error de mapeo.

Gracias
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp