Crear una relación many-to-many con Doctrine

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.

2 thoughts on “Crear una relación many-to-many con Doctrine

  1. 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.

  2. 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!

Comments are closed.