Vamos a ver como informar al magnífico ORM Doctrine de que debe tratar un par de tablas con una relación many-to-many utilizando una tabla intermedia.
Supongamos que tenemos una talba de jugadores de fútbol y una tabla de equipos. Un equipo estará compuesto por varios jugadores y a su vez, un jugador puede estar relacionado con varios equipos (el actual, más los equipos por los que ha pasado en su vida deportiva).
Para este ejemplo necesitaremos tres tablas: Team, Player y una relacional TeamPlayer. El schema.yml de este escenario sería:
# Player table Player: tableName: player columns: id: type: integer(4) unsigned: 1 primary: true autoincrement: true first_name: string(255) last_name: string(255) weight: float(2147483647) height: float(2147483647) relations: Team: <strong>class</strong>: Team <strong>local</strong>: player_id <strong>foreign</strong>: team_id <strong>refClass</strong>: TeamPlayer #Team table tableName: team columns: id: type: integer(4) unsigned: 1 primary: true autoincrement: true name: string(255) relations: Player: <strong>class</strong>: Player <strong>local</strong>: team_id <strong>foreign</strong>: player_id <strong>refClass</strong>: TeamPlayer #TeamPlayer table TeamPlayer: tableName: team_player columns: team_id: type: integer(4) unsigned: 1 primary: true player_id: type: integer(4) unsigned: 1 primary: true
Los puntos importantes están en las relaciones de las tablas Team y Player, donde indicaremos los campos:
- class: La clase encargada de manejar el objeto relacionado.
- local: El nombre del campo que hace de vínculo entre la tabla en la que estoy y la tabla relacional TeamPlayer
- foreign: El nombre del campo que hace de vínculo entre la tabla relacionada y la tabla relacional TeamPlayer
- refClass: Nombre del objeto encargado de realizar la relación
Siguiendo estos pasos podremos acceder a todos los equipos de un jugador y a todos los jugadores de un equipo sin ningún problema.
Mil mil mil millones de gracias. Leí el libro de referencia de Doctrine, pero no profundizan en el tema de relaciones, quedé con muchas dudas en la parte de many to many, porque no sabía bien cuándo utilizar eso de refClass, class, etc.
Según el libro, no es necesario declarar las 2 referencias en ambas clases primarias, porque haciéndolo en una, Doctrine creará el de la otra.
Pero con tu ejemplo, ahora estoy claro.
Muchas gracias.
Estoy muy agradecido, ya que no lograba hacer funcionar las relaciones. Estoy trabajando con una base de datos a la que no puedo modificar los nombres de los campos y en la documentación de Doctrine no explican en profundidad la configuración ya que asumen que estás usando los nombres “default” (clase “User” >> campo “user_id”). En mis tablas están al revés (id_user) y no encontraba manera. Gracias a tu post, entendí el papel de las propiedades “local” y “foreign” para configurar los campos en las relaciones many-to-many.
Muchas gracias, saludos!