tutorial example español php mysql orm doctrine

example - install doctrine php



relación de muchos a muchos en la doctrina (3)

Tengo algunas tablas en mi sistema como estas:

news --id --title --content video --id --title --url album --id --title

Ahora, necesito hacer una relación de muchos a muchos con estas tablas, pero de una manera flexible. Creé una tabla llamada ''enlaces'' con la siguiente estructura:

links --parent_entity (example: news) --parent_id (example: 5) --child_entity (exmaple: video) --child_id (example: 2)

¿Cómo puedo mapear esto usando Doctrine?


La documentación de Doctrine es bastante buena. No estoy muy seguro de lo que quiere decir con "flexible", pero aquí está el ejemplo de configuración yaml para las relaciones de Muchos a Muchos para Doctrine versión 1.2.

--- User: columns: id: type: integer(4) autoincrement: true primary: true username: type: string(255) password: type: string(255) attributes: export: all validate: true Group: tableName: group_table columns: id: type: integer(4) autoincrement: true primary: true name: type: string(255) relations: Users: foreignAlias: Groups class: User refClass: GroupUser GroupUser: columns: group_id: type: integer(4) primary: true user_id: type: integer(4) primary: true relations: Group: foreignAlias: GroupUsers User: foreignAlias: GroupUsers


Esto no es posible porque no puedes hacer una unión adecuada. La combinación en este caso dependerá del valor en parent_entity y child_entity (es decir, cada fila puede necesitar unirse a una tabla diferente). Además, cómo la doctrina sabrá qué tipo de registro hidratar (es decir, porque depende del tipo de entidad).

Es posible que puedas quitar algo como esto (aunque será raro) usando la cláusula WITH en tus uniones. Por ejemplo, en el método setUp () de su modelo de noticias, puede hacer:

$this->hasMany(''Links as NewsVideoLinks'', array(''local'' => ''id'', ''foreign'' => ''parent_id''));

Y en la configuración de su modelo de enlaces:

$this->hasMany(''Videos as videos'', array(''local'' => ''child_id'', ''foreign'' => ''id''));

Debería definir todas las combinaciones de combinaciones en el modelo de Enlaces. Lo que quiero decir es que tendrías que decirle que también tiene muchas noticias y álbumes usando tanto child_id como parent_id.

Y luego en su consulta, tendría que hacer algo como:

$query = Doctrine_Query::create(); $query->from(''News n''); $query->innerJoin("n.NewsVideoLinks as links WITH parent_entity = ''news''"); $query->innerJoin("links.Videos as vids WITH child_entity = ''videos''"); $results = $query->execute();

Como pueden ver, esto es muy engorroso. Recomiendo encarecidamente crear tablas de unión para cada relación. Aún obtendrías lo que estás buscando uniéndote a cada mesa de unión.


Si entiendo correctamente el diseño de su base de datos, "parent_entity" y "child_entity" representan la tabla a la que desea vincular los identificadores.

Esta es "técnicamente" una estructura de base de datos incorrecta (consulte la normalización de la base de datos ) ya que no puede asignar estas columnas a ninguna otra columna de tabla única . Básicamente, no puede usar sus columnas de id ahora porque es ambigua.

Creo que tienes que volver a pensar en la lógica de tu base de datos, entonces sería más fácil escribir el código después de las palabras.