Ver Mensaje Individual
  #4 (permalink)  
Antiguo 01/07/2010, 17:09
Avatar de maycolalvarez
maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 3 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