Relacion sobre la misma tabla

373 views
Skip to first unread message

cgb

unread,
Feb 2, 2010, 8:56:10 PM2/2/10
to symfony-es
Hola a todos. Tengo una tabla Usuarios y tengo que asignar a un
determinado usuario un usuario para que lo supervise. He ideado crear
una segunda tabla llamada supervisaA que mantiene quien supervisa a
quien. La estructura es:

Usuario:
actAs: { Timestampable: ~ }
columns:
nombre: { type: string(255), notnull: true, unique: true }
email: { type: string(255) }
telefono: { type: string(255) }

SupervisaA:
actAs: { Timestampable: ~ }
columns:
supervisor_id: { type : integer, notnull: true }
supervisado_id: { type : integer, notnull: true }
relations:
Usuario: { onDelete: RESTRICT, onUpdate: CASCADE, local:
supervisor_id, foreign: id, foreignType: one}
Usuario: { onDelete: RESTRICT, onUpdate: CASCADE, local:
supervisado_id, foreign: id, foreignType: many}

Pero no estoy seguro que este diseño sea el correcto y que symfony lo
pueda manejar correctamente. Espero sus comentarios. Gracias

Oscar López

unread,
Feb 3, 2010, 2:28:17 AM2/3/10
to symfo...@googlegroups.com
Y lo quieres hacer así porque es la forma en que se te ha ocurrido o porque te ha dado algún problema poner la foreign key a la misma tabla??? Yo no tengo experiencia con los ORM, pero ese es el típico ejemplo que se pone cuando se quiere explicar en qué casos se puede necesitar crear una clave foránea que apunte a la misma tabla. Me imagino que en el esquema sería algo así:


Usuario:
   actAs: { Timestampable: ~ }
   columns:
     nombre: { type: string(255), notnull: true, unique: true }
     email: { type: string(255) }
     telefono: { type: string(255) }
        supervisor_id: { type : integer, notnull: true }
   relations:
     Usuario: { onDelete: RESTRICT, onUpdate: CASCADE, local:
     supervisor_id, foreign: id, foreignType: one}


--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/symfony-es?hl=es.


Javier Garcia

unread,
Feb 3, 2010, 3:28:31 AM2/3/10
to symfo...@googlegroups.com
En este enlace de aquí abajo hay dos modelos User y UserFriend. UserFriend es la tipica tabla de enlace para que User se pueda apuntar a si misma.  Las relaciones de amistad son un ejemplo de modelos que se apuntan a si mismos.

http://www.symfony-project.org/cookbook/1_2/en/retrieving_data_with_doctrine

Ya nos contarás si te sirvió.

Javi

Oscar López

unread,
Feb 3, 2010, 4:50:27 AM2/3/10
to symfo...@googlegroups.com
Pero no es exactamente lo mismo. En una relación de amistad, una persona puede tener varios amigos, por lo que al ser una relación n:m es inevitable tener que apoyarse en otra tabla. Sin embargo, en una relación en la que se necesita especificar quién es tu jefe o tu supervisor, cada persona tiene un único jefe (es una relación 1:n), por lo que se puede especificar esa relación en la misma tabla.

Rodrigo Ruiz Fuentes

unread,
Feb 3, 2010, 7:56:54 AM2/3/10
to symfo...@googlegroups.com
El 03/02/2010 6:50, Oscar López escribió:
> Pero no es exactamente lo mismo. En una relación de amistad, una persona
> puede tener varios amigos, por lo que al ser una relación n:m es
> inevitable tener que apoyarse en otra tabla. Sin embargo, en una
> relación en la que se necesita especificar quién es tu jefe o tu
> supervisor, cada persona tiene un único jefe (es una relación 1:n), por
> lo que se puede especificar esa relación en la misma tabla.
>
[...]

Las veces que me ha tocado modelar situaciones similares, siempre creo
una sola tabla con la información mas una foreign key apuntando a la
misma tabla, muchas veces puede ser null, ya que si no tiene asignado un
encargado, entonces dicho campo debe quedar vacío.

--
Rodrigo Ruiz Fuentes

Claudio Brandolin

unread,
Feb 3, 2010, 10:01:50 AM2/3/10
to symfo...@googlegroups.com
Pero como puedo agregar un registro donde el encargado sea null siendo que el foreign me obliga a tener un registro no nulo para ese campo. Sino se estaría produciendo un error de inconsistencia en el foreign. Como se puede definir eso en la estructura schema.yml ?


--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/symfony-es?hl=es.




--
Claudio Brandolin

Oscar López

unread,
Feb 3, 2010, 10:20:32 AM2/3/10
to symfo...@googlegroups.com
No hay ningun tipo de inconsistencia, las foreign keys pueden ser nulas.

Rodrigo Ruiz Fuentes

unread,
Feb 3, 2010, 10:22:20 AM2/3/10
to symfo...@googlegroups.com
El 03/02/2010 12:01, Claudio Brandolin escribió:
> Pero como puedo agregar un registro donde el encargado sea null siendo
> que el foreign me obliga a tener un registro no nulo para ese campo.
> Sino se estaría produciendo un error de inconsistencia en el foreign.
> Como se puede definir eso en la estructura schema.yml ?
>
> El 3 de febrero de 2010 09:56, Rodrigo Ruiz Fuentes <rru...@gmail.com

El hecho que sea foreign key no necesariamente te obliga a que sea not
null, en una relación 0:1 como en este caso, dicho campo puede quedar vacío.
En el schema.yml debes indicarle a la clave foránea notnull: false.

Slds.-

>
> Las veces que me ha tocado modelar situaciones similares, siempre
> creo una sola tabla con la información mas una foreign key apuntando
> a la misma tabla, muchas veces puede ser null, ya que si no tiene
> asignado un encargado, entonces dicho campo debe quedar vacío.
>
> --
> Rodrigo Ruiz Fuentes
>

--
Rodrigo Ruiz Fuentes

Mario Nunes

unread,
Feb 3, 2010, 2:00:33 PM2/3/10
to symfo...@googlegroups.com
Si no lo he entendido mal, al final SupervisaA tiene una estructura arbórea, tal vez este plugin te pueda resultar interesante:

http://www.symfony-project.org/plugins/sfDoctrineTreePlugin

Si no siempre puedes hacer una búsqueda:

http://www.symfony-project.org/plugins/filter?filter[sf_1_0]=on&filter[sf_1_1]=on&filter[sf_1_2]=on&filter[sf_1_3]=on&filter[sf_1_4]=on&filter[propel]=on&filter[doctrine]=on&filter[category_id]=&filter[name]=tree

Salu2.




El 3 de febrero de 2010 02:56, cgb <cgbra...@gmail.com> escribió:

Claudio Brandolin

unread,
Feb 3, 2010, 2:11:46 PM2/3/10
to symfo...@googlegroups.com
Si mario, supervisaA forma una realacion tipo arbol, Estoy implementando esta relacion sobre la misma tabla. Este plugings funcionara con esta misma estructura ?
--
Claudio Brandolin

Claudio Brandolin

unread,
Feb 3, 2010, 3:43:47 PM2/3/10
to symfo...@googlegroups.com
hice la siguiente estructura (resumida)

Usuario:
  columns:
    nombre: { type: string(255), notnull: true, unique: true }
    email: { type: string(255) }
    telefono: { type: string(255) }    
    msn: { type: string(255) }
  relations:    
    Supervisacion: {class: AwebUsuario, refClass: AwebSupervisacion, local: supervisor_id, foreign: supervisado_id, foreignType: one}

Supervisacion:
  columns:
    supervisor_id: {type: integer, primary: true}
    supervisado_id: { type: integer, primary: true }
  relations:
    Supervisor: { class: Usuario, local: supervisor_id, foreign: id, foreignAlias: Supervisor, onDelete: RESTRICT, foreignType: one }
    Supervisado: { class: Usuario, local: supervisado_id, foreign: id, foreignAlias: Supervisado, onDelete: RESTRICT, foreignType: one }

Ahora bien, estoy queriendo agregar un nuevo usuario con el usuario logueado como usuario supervisor, para lo que estoy usando las siguientes lineas.

public function executeNew(sfWebRequest $request) {
        $userLogin = $this->getUser()->getGuardUser()->getUsuario();
        $guarUser = new sfGuardUser();
        $guarUser->getUsuario()->setSupervisor($userLogin);
        $this->form = new UsuarioGuardSimpleForm($guarUser);
    }

pero me da el siguiente error. 

Unknown record property / related component "supervisor_id" on "Usuario"

Alguien sabe porque sucede esto? Como debo configurar el usuario supervisor para un usuario nuevo.

Muchas Gracias
--
Claudio Brandolin

Reply all
Reply to author
Forward
0 new messages