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

Ayuda relacion ternaria con Doctrine en Symfony!!!

Estas en el tema de Ayuda relacion ternaria con Doctrine en Symfony!!! en el foro de Symfony en Foros del Web. Amigos, cómo puedo establecer una relación ternaria usando doctrine?? Por ejemplo, tengo tres tablas A, B y C, y necesito establecer una relación ternaria entre ...
  #1 (permalink)  
Antiguo 01/07/2010, 09:54
Avatar de ympons  
Fecha de Ingreso: diciembre-2008
Mensajes: 6
Antigüedad: 15 años, 4 meses
Puntos: 0
Ayuda relacion ternaria con Doctrine en Symfony!!!

Amigos, cómo puedo establecer una relación ternaria usando doctrine??

Por ejemplo, tengo tres tablas A, B y C, y necesito establecer una relación ternaria entre las tablas donde R(idA, idB, idC)
  #2 (permalink)  
Antiguo 01/07/2010, 11:21
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Ayuda relacion ternaria con Doctrine en Symfony!!!

si posteas un previo del modelo (yml) con las tablas seria más fácil ayudarte e indicarla cardinalidad de cada una con respecto a la otra:

para un blog:
Código YAML:
Ver original
  1. Categoria:
  2.   connection: doctrine
  3.   tableName: blog_categoria
  4.   columns:
  5.     id:
  6.       type: integer(4)
  7.       fixed: false
  8.       unsigned: false
  9.       primary: true
  10.       sequence: blog_categoria_id #postgres
  11.     nombre:
  12.       type: string(50)
  13.       fixed: false
  14.       unsigned: false
  15.       notnull: false
  16.       primary: false
  17.   relations:
  18.     Articulo:
  19.       local: id
  20.       foreign: categoria_id
  21.       type: many
  22.        
  23.      
  24.  
  25. Articulo:
  26.   connection: doctrine
  27.   tableName: blog_articulo
  28.   columns:
  29.     id:
  30.       type: integer(4)
  31.       fixed: false
  32.       unsigned: false
  33.       primary: true
  34.       #postgres
  35.       sequence: blog_articulo_id
  36.     titulo:
  37.       type: string()
  38.       fixed: false
  39.       unsigned: false
  40.       notnull: false
  41.       primary: false
  42.     culturainfo:
  43.       type: string(200)
  44.       fixed: false
  45.       unsigned: false
  46.       notnull: false
  47.       primary: false
  48.     contenido:
  49.       type: string()
  50.       fixed: false
  51.       unsigned: false
  52.       notnull: false
  53.       primary: false
  54.     created_at:
  55.       type: timestamp(25)
  56.       fixed: false
  57.       unsigned: false
  58.       notnull: false
  59.       primary: false
  60.     adicional:
  61.       type: string(20)
  62.       name: adicional as campox
  63.       fixed: false
  64.       unsigned: false
  65.       notnull: false
  66.       primary: false
  67.     categoria_id:
  68.       type: integer(4)
  69.       fixed: false
  70.       unsigned: false
  71.       notnull: true
  72.       primary: false
  73.   relations:
  74.     Comentario:
  75.       local: id
  76.       foreign: articulo_id
  77.       type: many
  78.     Categoria:
  79.       local: categoria_id
  80.       foreign: id
  81.       type: one
  82.  
  83. Comentario:
  84.   connection: doctrine
  85.   tableName: blog_comentario
  86.   columns:
  87.     id:
  88.       type: integer(4)
  89.       fixed: false
  90.       unsigned: false
  91.       primary: true
  92.       sequence: blog_comentario_id
  93.     articulo_id:
  94.       type: integer(4)
  95.       fixed: false
  96.       unsigned: false
  97.       notnull: true
  98.       primary: false
  99.     autor:
  100.       type: string()
  101.       fixed: false
  102.       unsigned: false
  103.       notnull: false
  104.       primary: false
  105.     contenido:
  106.       type: string()
  107.       fixed: false
  108.       unsigned: false
  109.       notnull: false
  110.       primary: false
  111.     created_at:
  112.       type: timestamp(25)
  113.       fixed: false
  114.       unsigned: false
  115.       notnull: false
  116.       primary: false
  117.   relations:
  118.     Articulo:
  119.       local: articulo_id
  120.       foreign: id
  121.       type: one

Última edición por maycolalvarez; 01/07/2010 a las 11:34
  #3 (permalink)  
Antiguo 01/07/2010, 16:27
Avatar de ympons  
Fecha de Ingreso: diciembre-2008
Mensajes: 6
Antigüedad: 15 años, 4 meses
Puntos: 0
Pregunta Respuesta: Ayuda relacion ternaria con Doctrine en Symfony!!!

gracias maycolalvarez por el ejemplo, mi problema radica en que no se como establecer las relaciones entre Estudiante, Materia y Local en el YML,
según lo que debo hacer Estudiante se relaciona con Materia de muchos a muchos, lo mismo ocurre con Estudiante y Local,y Materia y Local.
es decir, todos se relacionan con todos de muchos a muchos.

Mi modelo relacional queda de esta forma:

Estudiante(id_estudiante, nombre, correo)
Materia(id_materia, nombre, descripcion)
Local(id_local, direccion, descripcion)

R_Estudiante_Materia_Local(id_estudiante, id_materia, id_local, responsable)


Más abajo está mi YML, solo que no me he atrevido a establecer las relaciones porque no se como hacerlo.

Código YML:
Ver original
  1. Estudiante:
  2.   connection: doctrine
  3.   tableName: test_estudiante
  4.   columns:
  5.     id:
  6.       type: integer(4)
  7.       fixed: false
  8.       unsigned: false
  9.       primary: true            
  10.       sequence: test_estudiante_id
  11.     nombre:
  12.       type: string(50)
  13.       fixed: false
  14.       unsigned: false
  15.       notnull: false
  16.       primary: false
  17.     correo:
  18.       type: string(50)
  19.       fixed: false
  20.       unsigned: false
  21.       notnull: false
  22.       primary: false
  23.   relations:
  24.      
  25.  
  26. Materia:
  27.   connection: doctrine
  28.   tableName: test_materia
  29.   columns:
  30.     id:
  31.       type: integer(4)
  32.       fixed: false
  33.       unsigned: false
  34.       primary: true      
  35.       sequence: test_materia_id
  36.     nombre:
  37.       type: string(50)
  38.       fixed: false
  39.       unsigned: false
  40.       notnull: false
  41.       primary: false
  42.     descripcion:
  43.       type: string(200)
  44.       fixed: false
  45.       unsigned: false
  46.       notnull: false
  47.       primary: false
  48.   relations:
  49.  
  50.  
  51. Local:
  52.   connection: doctrine
  53.   tableName: test_local
  54.   columns:
  55.     id:
  56.       type: integer(4)
  57.       fixed: false
  58.       unsigned: false
  59.       primary: true
  60.       sequence: test_local_id
  61.     direccion:
  62.       type: string(50)
  63.       fixed: false
  64.       unsigned: false
  65.       notnull: false
  66.       primary: false
  67.     descripcion:
  68.       type: string(200)
  69.       fixed: false
  70.       unsigned: false
  71.       notnull: false
  72.       primary: false
  73.   relations:
  #4 (permalink)  
Antiguo 01/07/2010, 17:09
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Ayuda relacion ternaria con Doctrine en Symfony!!!

para las relaciones muchos a muchos debes de crear una tabla puente que te permita llevar eso a cabo, Doctrine tiene una forma muy especial de hacerlo (que me encanta), es un poco enredada de explicar, pero te lo explico paso a paso con código, así lograrás aprenderlo:

Código YAML:
Ver original
  1. #creamos la tabla puente para relaciones muchos a muchos (many to many):
  2. MateriaEstudiante:
  3.   connection: doctrine
  4.   columns:
  5.    #establecemos los campos a relacionar materia_id y estudiante_id y ambos como PK:
  6.     materia_id:
  7.       type: integer
  8.       primary: true
  9.     estudiante_id:
  10.       type: integer
  11.       primary: true
  12.  
  13. Estudiante:
  14.   connection: doctrine
  15.   tableName: test_estudiante
  16.   columns:
  17.     id:
  18.       type: integer(4)
  19.       fixed: false
  20.       unsigned: false
  21.       primary: true
  22.       sequence: test_estudiante_id
  23.     nombre:
  24.       type: string(50)
  25.       fixed: false
  26.       unsigned: false
  27.       notnull: false
  28.       primary: false
  29.     correo:
  30.       type: string(50)
  31.       fixed: false
  32.       unsigned: false
  33.       notnull: false
  34.       primary: false
  35.   relations:
  36.    #relacionamos directamente con la tabla asociada y la colocamos en plural para el hydrating(opcional), NO la puente
  37.     Materias:
  38.      #definimos la clase verdadera, es "Materia" no "Materias" que usa el hydrating
  39.       class: Materia
  40.       #definimos el campo local aunque este NUNCA existirá en la misma tabla (seria el id), si no en la puente ;-)
  41.       local: estudiante_id
  42.       #igualmente definimos la foránea
  43.       foreign: materia_id
  44.       #por ultimo y más importante, para que doctrine sepa que se trata de un many to many, definir la clase de referencia (o la del puente)
  45.       refClass: MateriaEstudiante
  46.       #aplicamos lo mismo a la otra tabla, pero de modo inverso
  47.  
  48. Materia:
  49.   connection: doctrine
  50.   tableName: test_materia
  51.   columns:
  52.     id:
  53.       type: integer(4)
  54.       fixed: false
  55.       unsigned: false
  56.       primary: true
  57.       sequence: test_materia_id
  58.     nombre:
  59.       type: string(50)
  60.       fixed: false
  61.       unsigned: false
  62.       notnull: false
  63.       primary: false
  64.     descripcion:
  65.       type: string(200)
  66.       fixed: false
  67.       unsigned: false
  68.       notnull: false
  69.       primary: false
  70.   relations:
  71.    #relacionamos directamente con la tabla asociada y la colocamos en plural para el hydrating(opcional), NO la puente
  72.     Estudiantes:
  73.      #definimos la clase verdadera, es "Estudiante" no "Estudiantes" que usa el hydrating
  74.       class: Estudiante
  75.       #definimos el campo local aunque este NUNCA existirá en la misma tabla (seria el id), si no en la puente ;-)
  76.       local: materia_id
  77.       #igualmente definimos la foránea
  78.       foreign: estudiante_id
  79.       #por ultimo y más importante, para que doctrine sepa que se trata de un many to many, definir la clase de referencia (o la del puente)
  80.       refClass: MateriaEstudiante

el punto es refClass que permite decirle a doctrine cual es la verdadera tabla involucrada, así los widgets propios de doctrine para este tipo de relaciones funcionan de mil maravillas, suerte y espero que resuelva tus dudas, todo esta en la api de Doctrine
  #5 (permalink)  
Antiguo 11/10/2010, 21:29
Avatar de ympons  
Fecha de Ingreso: diciembre-2008
Mensajes: 6
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Ayuda relacion ternaria con Doctrine en Symfony!!!

Muchas gracias maycolalvarez, el ejemplo fue de mucha ayuda al igual que la API de Doctrine.
  #6 (permalink)  
Antiguo 12/10/2010, 02:20
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 2 meses
Puntos: 772
Hola ympons

Muevo tu tema al foro de PHP desde Web general.

Saludos,
  #7 (permalink)  
Antiguo 29/11/2011, 13:25
 
Fecha de Ingreso: noviembre-2011
Ubicación: La Habana
Mensajes: 3
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Ayuda relacion ternaria con Doctrine en Symfony!!!

Este caso resuelve el problema cuando es una relación many-to-many entre dos tablas, pero una relación ternaria es diferente, tendría que repetir las relaciones entre cada par de tablas de la relación???

Algo como:
Estudiante-Materia
Estudiante-Local
Materia-Local


Saludos y gracias.
  #8 (permalink)  
Antiguo 29/11/2011, 14:27
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Ayuda relacion ternaria con Doctrine en Symfony!!!

¿para que revives un POST de hace más de un año?.

en efecto los ORM solo contemplan las relaciones muchos a muchos entre 2 tablas, si has de querer implementar una muchos a muchos de 3 tablas, lo mejor es crear explícitamente la entidad que hace de puente a las 3 y usar las relaciones onetomany y manytoone
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Etiquetas: doctrine, php, relacion
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 22:02.