Relaciones en Symfony 1.4 con Doctrine
Una de las dificultades que podemos encontrar al utilizar el ORM Doctrine (por ejemplo, en Symfony) es configurar las relaciones entre tablas en el schema.yml que define nuestra base de datos. A modo de ejemplo, voy a mostrar los tres tipos de relaciones que podemos querer configurar:
Relaciones uno a uno
Un caso típico para este tipo de relación es el de un usuario y su perfil. Un usuario solamente tiene un perfil y un perfil solo puede pertenecer a un usuario.
User:
tableName: user
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
email:
type: string(255)
notnull: true
unique: true
password:
type: string(45)
Profile:
tableName: profile
columns:
user_id:
type: integer(4)
primary: true
notnull: true
autoincrement: false
nickname: string(255)
relations:
User:
class: User
local: user_id
foreign: id
foreignAlias: Profile
type: one
foreignType: one |
Con esta relación, podremos acceder al perfil de un usuario así:
$user->Profile->nickname // obtenemos el nickname del perfil del usuario |
Relaciones uno a muchos:
Un ejemplo de este tipo de relación es el de los usuarios y sus números de teléfono. Un usuario puede tener varios números de teléfono pero un teléfono solo puede pertenecer a un usuario.
User:
tableName: user
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
email:
type: string(255)
notnull: true
unique: true
password:
type: string(45)
Telephone:
tableName: telephone
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
user_id:
type: integer(4)
notnull: true
number:
type: string(255)
relations:
User:
class: User
local: user_id
foreign: id
foreignAlias: Telephones
type: one
foreignType: many |
Para acceder a los números de teléfono de un usuario, podemos hacer:
foreach($user->Telephones as $telephone){ echo $telephone->number; } |
Relaciones muchos a muchos
Para terminar, un caso típico de esta relación es la que podemos encontrar entre los artículos de un blog y sus etiquetas. Un artículo puede tener varias etiquetas y una etiqueta puede asignarse a varios artículos. En esta relación necesitaremos obligatoriamente una tercera tabla (article_tags) para poder relacionar la tabla articles y la tabla tags.
Article:
tableName: articles
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
title:
type: string(100)
notnull: true
Tag:
tableName: tags
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
name:
type: string(100)
notnull: true
relations:
Article:
foreignAlias: Tags
class: Article
refClass: ArticleTag
ArticleTag:
tableName: article_tags
columns:
article_id:
type: integer(4)
primary: true
tag_id:
type: integer(4)
primary: true
relations:
Article:
foreignAlias: ArticleTags
Tag:
foreignAlias: ArticleTags |
Podremos obtener el nombre de todos los tags de un artículo de la siguiente manera:
foreach($article->ArticleTags as $article_tag){ echo $article_tag->Tag->name; } |
¡Cualquier duda, en los comentarios!
Saludos compañero, muy buena la información q tienes. He estado trabajando con Symfony 1.4 con conexión a base de datos PostgreSQL con varios esquemas (sfPostgresDoctrinePlugin), y he presentado problemas a la hora de generar los formularios con «doctrine:generate module», dado que me arroja errores al momento de representarme los combobox que deberían tener valores (id) de tablas relacionadas 1:N , aun cuando he redefinido los métodos __toString(). Queria saber si tienes experiencia en esta area y podrias orientarme. Saludos
creo q explicación mas clara no existe, GRACIAS!! 🙂