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.