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

Relacion 1:N en tabla padre

Estas en el tema de Relacion 1:N en tabla padre en el foro de Symfony en Foros del Web. Hola, como ya dije en una discusión anterior soy nuevo con symfony y los ORM como doctrine; actualmente estoy desarrollando una aplicación muy sencilla, pero ...
  #1 (permalink)  
Antiguo 30/01/2013, 20:23
 
Fecha de Ingreso: enero-2013
Mensajes: 4
Antigüedad: 11 años, 3 meses
Puntos: 0
Relacion 1:N en tabla padre

Hola,

como ya dije en una discusión anterior soy nuevo con symfony y los ORM como doctrine; actualmente estoy desarrollando una aplicación muy sencilla, pero tengo algunas inquietudes que me gustaría comentar con ustedes:

Quiero saber si en una tabla padre puedo tener una relacion N:N con otra tabla.

la idea basica en mi aplicación es tener una clase padre llamada User, de ella heredan las clases Administrador y Acudiente, ahora, quiero hacer un login a mi gusto para que me muestre ciertos datos dependiendo del tipo de usuario, por tanto le he puesto una relación N:N con una entidad Roles, pero cuando intento traer los roles de mi usuario me muestra un error y no se que pueda estar pasando.

Tengo en mi aplicación la siguiente estructura:

Una clase usuario como la que se muestra a continuación:

Código PHP:
Ver original
  1. namespace User\userBundle\Entity;
  2.  
  3. use Doctrine\ORM\Mapping as ORM;
  4. use Doctrine\ORM\Mapping\InheritanceType;
  5. use Doctrine\ORM\Mapping\DiscriminatorColumn;
  6. use Doctrine\ORM\Mapping\DiscriminatorMap;
  7. use \Symfony\Component\Security\Core\User\UserInterface;
  8.  
  9. /**
  10.  * User\userBundle\Entity\User
  11.  *
  12.  * @ORM\Table(name = "tbl_user")
  13.  * @ORM\Entity(repositoryClass="User\userBundle\Entity\UserRepository")
  14.  *
  15.  * @InheritanceType("JOINED")
  16.  * @DiscriminatorColumn(name="discr", type="string")
  17.  * @DiscriminatorMap({"user" = "User", "administrator" = "Admin\adminBundle\Entity\Administrator", "acudiente" = "Acudiente\acudienteBundle\Entity\Acudiente"})
  18.  */
  19. class User implements UserInterface
  20. {
  21.     /**
  22.      * @var integer $id
  23.      *
  24.      * @ORM\Column(name="id", type="integer")
  25.      * @ORM\Id
  26.      * @ORM\GeneratedValue(strategy="AUTO")
  27.      */
  28.     private $id;
  29.  
  30.     /**
  31.      * @var string $primerNombre
  32.      *
  33.      * @ORM\Column(name="primerNombre", type="string", length=255)
  34.      */
  35.     private $primerNombre;
  36.  
  37.    
  38.     /**
  39.      * @var string $primerApellido
  40.      *
  41.      * @ORM\Column(name="primerApellido", type="string", length=255)
  42.      */
  43.     private $primerApellido;
  44.  
  45.  
  46.     /**
  47.      * @ORM\ManyToMany(targetEntity="User\userBundle\Entity\role")
  48.      * @ORM\JoinTable(name="rel_user_role", joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
  49.      * inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")})
  50.      */
  51.     protected $user_roles;
  52.    
  53.    
  54.     public function __construct() {
  55.         $this->user_roles = new \Doctrine\Common\Collections\ArrayCollection();
  56.     }
  57.    
  58.     /**
  59.      * Get id
  60.      *
  61.      * @return integer
  62.      */
  63.     public function getId()
  64.     {
  65.         return $this->id;
  66.     }
  67.  
  68.     /**
  69.      * Set primerNombre
  70.      *
  71.      * @param string $primerNombre
  72.      * @return User
  73.      */
  74.     public function setPrimerNombre($primerNombre)
  75.     {
  76.         $this->primerNombre = $primerNombre;
  77.    
  78.         return $this;
  79.     }
  80.  
  81.     /**
  82.      * Get primerNombre
  83.      *
  84.      * @return string
  85.      */
  86.     public function getPrimerNombre()
  87.     {
  88.         return $this->primerNombre;
  89.     }
  90.  
  91.     public function getRoles() {
  92.         return $this->user_roles->toArray();
  93.     }



ahora tengo la clase administrador:

Código PHP:
Ver original
  1. namespace Admin\adminBundle\Entity;
  2.  
  3. use Doctrine\ORM\Mapping as ORM;
  4. use backEnd\backEndBundle\Entity\User;
  5. use \Symfony\Component\Security\Core\User\UserInterface;
  6.  
  7. /**
  8.  * Admin\adminBundle\Entity\Administrator
  9.  *
  10.  * @ORM\Table(name= "tbl_administrador")
  11.  * @ORM\Entity(repositoryClass="Admin\adminBundle\Entity\AdministratorRepository")
  12.  */
  13. class Administrator extends User
  14. {
  15.     /**
  16.      * @var integer $id
  17.      *
  18.      * @ORM\Column(name="id", type="integer")
  19.      * @ORM\Id
  20.      * @ORM\GeneratedValue(strategy="AUTO")
  21.      */
  22.     private $id;
  23.  
  24.     /**
  25.      * @var integer $cedula
  26.      *
  27.      * @ORM\Column(name="cedula", type="integer")
  28.      */
  29.     private $cedula;
  30.  
  31.     /**
  32.      * @var \DateTime $fechaIngreso
  33.      *
  34.      * @ORM\Column(name="fechaIngreso", type="date")
  35.      */
  36.     private $fechaIngreso;
  37.  
  38.     /**
  39.      * @var string $username
  40.      *
  41.      * @ORM\Column(name="username", type="string", length=255)
  42.      */
  43.     private $username;
  44.  
  45.     /**
  46.      * @var string $password
  47.      *
  48.      * @ORM\Column(name="password", type="string", length=255)
  49.      */
  50.     private $password;
  51.  
  52.     /**
  53.      * @var string $email
  54.      *
  55.      * @ORM\Column(name="email", type="string", length=255)
  56.      */
  57.     private $email;
  58.  
  59.     /**
  60.      * @ORM\Column(name="salt", type="string", length=255)
  61.      */
  62.     protected $salt;
  63.  
  64.  
  65.     /**
  66.      * Get id
  67.      *
  68.      * @return integer
  69.      */
  70.     public function getId()
  71.     {
  72.         return $this->id;
  73.     }
  74.  
  75.     /**
  76.      * Set cedula
  77.      *
  78.      * @param integer $cedula
  79.      * @return Administrator
  80.      */
  81.     public function setCedula($cedula)
  82.     {
  83.         $this->cedula = $cedula;
  84.    
  85.         return $this;
  86.     }
  87.  
  88.     /**
  89.      * Get cedula
  90.      *
  91.      * @return integer
  92.      */
  93.     public function getCedula()
  94.     {
  95.         return $this->cedula;
  96.     }
  97.  
  98.     /**
  99.      * Set fechaIngreso
  100.      *
  101.      * @param \DateTime $fechaIngreso
  102.      * @return Administrator
  103.      */
  104.     public function setFechaIngreso($fechaIngreso)
  105.     {
  106.         $this->fechaIngreso = $fechaIngreso;
  107.    
  108.         return $this;
  109.     }
  110.  
  111.     /**
  112.      * Get fechaIngreso
  113.      *
  114.      * @return \DateTime
  115.      */
  116.     public function getFechaIngreso()
  117.     {
  118.         return $this->fechaIngreso;
  119.     }
  120.  
  121.     /**
  122.      * Set email
  123.      *
  124.      * @param string $email
  125.      * @return Administrator
  126.      */
  127.     public function setEmail($email)
  128.     {
  129.         $this->email = $email;
  130.    
  131.         return $this;
  132.     }
  133.  
  134.     /**
  135.      * Get email
  136.      *
  137.      * @return string
  138.      */
  139.     public function getEmail()
  140.     {
  141.         return $this->email;
  142.     }
  143.    
  144.     public function eraseCredentials() {
  145.        
  146.     }
  147.  
  148.     public function getPassword() {
  149.         return $this->password;
  150.     }
  151.  
  152.     public function getRoles() {
  153.         return $this->user_roles->toArray();
  154.     }
  155.  
  156.     public function getSalt() {
  157.         return $this->salt;
  158.     }
  159.  
  160.     public function getUsername() {
  161.         return $this->username;
  162.     }
  163. }


y por ultimo mi clase Acudiente:
Código PHP:
Ver original
  1. namespace Acudiente\acudienteBundle\Entity;
  2.  
  3. use Doctrine\ORM\Mapping as ORM;
  4. use User\userBundle\Entity\User;
  5.  
  6. /**
  7.  * Acudiente\acudienteBundle\Entity\Acudiente
  8.  *
  9.  * @ORM\Table(name= "tbl_acudiente")
  10.  * @ORM\Entity(repositoryClass="Acudiente\acudienteBundle\Entity\AcudienteRepository")
  11.  */
  12. class Acudiente extends User
  13. {
  14.     /**
  15.      * @var integer $id
  16.      *
  17.      * @ORM\Column(name="id", type="integer")
  18.      * @ORM\Id
  19.      * @ORM\GeneratedValue(strategy="AUTO")
  20.      */
  21.     private $id;
  22.  
  23.     /**
  24.      * @var integer $cedula
  25.      *
  26.      * @ORM\Column(name="cedula", type="integer")
  27.      */
  28.     private $cedula;
  29.  
  30.     /**
  31.      * Get id
  32.      *
  33.      * @return integer
  34.      */
  35.     public function getId()
  36.     {
  37.         return $this->id;
  38.     }
  39.  
  40.     /**
  41.      * Set cedula
  42.      *
  43.      * @param integer $cedula
  44.      * @return Acudiente
  45.      */
  46.     public function setCedula($cedula)
  47.     {
  48.         $this->cedula = $cedula;
  49.    
  50.         return $this;
  51.     }
  52.  
  53.     /**
  54.      * Get cedula
  55.      *
  56.      * @return integer
  57.      */
  58.     public function getCedula()
  59.     {
  60.         return $this->cedula;
  61.     }
  62.    
  63.    
  64.     /**
  65.      * @var string $username
  66.      *
  67.      * @ORM\Column(name="username", type="string", length=255)
  68.      */
  69.     private $username;
  70.  
  71.     /**
  72.      * @var string $password
  73.      *
  74.      * @ORM\Column(name="password", type="string", length=255)
  75.      */
  76.     private $password;
  77.  
  78.     /**
  79.      * @ORM\Column(name="salt", type="string", length=255)
  80.      */
  81.     protected $salt;
  82.    
  83.    
  84.      public function eraseCredentials() {
  85.        
  86.     }
  87.  
  88.     public function getPassword() {
  89.         return $this->password;
  90.     }
  91.  
  92.     public function getRoles() {
  93.         return $this->user_roles->toArray();
  94.     }
  95.  
  96.     public function getSalt() {
  97.         return $this->salt;
  98.     }
  99.  
  100.     public function getUsername() {
  101.         return $this->username;
  102.     }
  103. }
  #2 (permalink)  
Antiguo 30/01/2013, 21:38
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Relacion 1:N en tabla padre

Cual error te da?? Pues creo que tienes que estudiar bien si vale la pena convertir los roles en una entidad. Ahora no se si has visto ejemplos de ACL en symfony.
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 31/01/2013, 19:55
 
Fecha de Ingreso: enero-2013
Mensajes: 4
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Relacion 1:N en tabla padre

hola, gracias por responderme, este es el error que me muestra cuando intento loguearme: The target-entity Admin\adminBundle\Entity\role cannot be found in 'Admin\adminBundle\Entity\Administrator#user_roles '.

Ahora con respecto a ACL he leido algo, pero no me quedó muy claro (fue más facil comprender el ejemplo que había de roles en base de datos), no se si me podrías recomendar algún sitio con un ejemplo claro y sencillo para poder implementarlo, como te digo soy nuevo en el framework y no estaría 100% seguro de cual es la mejor opción para los roles, te agradecería mucho que me des alguna recomendación para poder elegir, es decir ¿cuáles son los puntos a tener en cuenta al momento de elegir entre ACL y roles con base de datos?, ¿en qué momento aplica uno u otro método?

Igualmente mil gracias por tu ayuda y tus comentarios
  #4 (permalink)  
Antiguo 31/01/2013, 20:41
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Relacion 1:N en tabla padre

Esa mezcla de mayúsculas y minúsculas en el namespace , antes que nada te sugiero que respetes los estándares,

mal
Admin\adminBundle\Entity\role

bien
Admin\AdminBundle\Entity\Role

y segundo, porque no utilizas los bundles de sf ?, por lo que muestras deberías tener mínimo FOSUserBundle + SonataAdminBundle

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: padre, relacion, tabla
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 05:32.