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#creamos la tabla puente para relaciones muchos a muchos (many to many):
MateriaEstudiante:
connection: doctrine
columns:
#establecemos los campos a relacionar materia_id y estudiante_id y ambos como PK:
materia_id:
type: integer
primary: true
estudiante_id:
type: integer
primary: true
Estudiante:
connection: doctrine
tableName: test_estudiante
columns:
id:
type: integer(4)
fixed: false
unsigned: false
primary: true
sequence: test_estudiante_id
nombre:
type: string(50)
fixed: false
unsigned: false
notnull: false
primary: false
correo:
type: string(50)
fixed: false
unsigned: false
notnull: false
primary: false
relations:
#relacionamos directamente con la tabla asociada y la colocamos en plural para el hydrating(opcional), NO la puente
Materias:
#definimos la clase verdadera, es "Materia" no "Materias" que usa el hydrating
class: Materia
#definimos el campo local aunque este NUNCA existirá en la misma tabla (seria el id), si no en la puente ;-)
local: estudiante_id
#igualmente definimos la foránea
foreign: materia_id
#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)
refClass: MateriaEstudiante
#aplicamos lo mismo a la otra tabla, pero de modo inverso
Materia:
connection: doctrine
tableName: test_materia
columns:
id:
type: integer(4)
fixed: false
unsigned: false
primary: true
sequence: test_materia_id
nombre:
type: string(50)
fixed: false
unsigned: false
notnull: false
primary: false
descripcion:
type: string(200)
fixed: false
unsigned: false
notnull: false
primary: false
relations:
#relacionamos directamente con la tabla asociada y la colocamos en plural para el hydrating(opcional), NO la puente
Estudiantes:
#definimos la clase verdadera, es "Estudiante" no "Estudiantes" que usa el hydrating
class: Estudiante
#definimos el campo local aunque este NUNCA existirá en la misma tabla (seria el id), si no en la puente ;-)
local: materia_id
#igualmente definimos la foránea
foreign: estudiante_id
#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)
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