Relaciones entre entidades: Parte I

Hola a todos! Hoy os traigo la primera de dos partes en las que he dividido esta nueva entrada acerca del desarrollo de aplicaciones con Yii Framework. En ellas veremos cómo se establecen relaciones entre dos entidades del modelo, es decir, dos clases ubicadas en la carpeta models y que representan una entidad de nuestro modelo.

Vamos a continuar ampliando las funcionalidades del proyecto basic con el que venimos trabajando en entradas anteriores como Yii Framework: Gii, al cual vamos a añadir un par de clases nuevas (País y Ciudad) que nos permitan aportar más información sobre los usuarios que se registran en nuestro sistema.

Entorno de desarrollo

  • OS X Yosemite (10.10.3) – SSOO
  • MAMP (3.2.1) (PHP 5,6,7, MySQL 5.0.11-dev y Apache 2.2.29) – Lenguaje, Servidor y gestor de bases de datos).
  • Sublime Text (3) – Editor de texto
  • Yii Framework (2.0.4) – Framework de desarrollo PHP
  • Composer (1.0-dev) – Gestor de dependencias para PHP

Un rápido repaso

En el último post conocimos una herramienta fantástica que Yii Framework provee para la generación automática del código de nuestras clases del modelo, la vista y el controlador a través de un sencillo e intuitivo asistente: Gii.

Con esta herramienta generamos una sencilla administración que nos permite realizar las operaciones CRUD de los usuarios registrados en el sistema y además trabajamos sobre el comportamiento de algunos campos para darle un poco de coherencia a la creación de usuario en el sistema.

Por dónde empezamos?

Vamos a construir las clases País (Country.php) y Ciudad (City.php) y a dotarles de sus secciones de administración correspondientes igual que hicimos con la clase User. Para ello pondremos en práctica los conocimientos aprendidos en la entrada anterior sobre Gii, pero antes que nada necesitamos construir las tablas de la BBDD que representarán esas dos entidades. Os dejo el código SQL para que lo lancéis contra vuestro esquema del proyecto basic (en mi caso lo llamé yii2basic) y así agilizamos el trabajo:

--
-- Estructura de tabla para la tabla `country`
--
CREATE TABLE `country` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`create_at` timestamp NOT NULL,
`update_at` timestamp NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Estructura de tabla para la tabla `city`
--
CREATE TABLE `city` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`city` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`country_id` int(11) NOT NULL,
`create_at` timestamp NOT NULL,
`update_at` timestamp NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Sobre el código SQL anterior, comentar dos cosas:

  1. Desde hace tiempo sigo la buena práctica de aportar un sistema para auditar la información de las tablas de la BBDD de manera que añadiendo los campos de tipo fecha (create_at y update_at) puedo conocer cuándo se dan de alta y se modifican los registro.
  2. En la tabla city he añadido un campo country_id que nos permitirá definir la relación entre ciudad y país estableciendo que: una ciudad pertenece a un país y un país puede contener varias ciudades.

Hecho esto vamos a nuestro navegador para construir las clases del modelo la vista y el controlador a través de Gii. Os pongo el ejemplo de country y os dejo a vosotros el ejercicio de crear el código para la clase city:

Primero el modelo:

yiirelationships1

A continuación el controlador y las vistas:

yiirelationships2

Ahora veamos cómo queda la estructura del proyecto:

yiirelationships3

Ahora vamos a establecer la relación entre País y Ciudad, de manera que cuando consultemos una país obtengamos el nombre de la ciudad en lugar del identificador. Para ello podemos optar por dos vías: implementar nosotros el código o hacer uso de Gii.

En ambos casos el resultado será el mismo y al final lo que veremos en nuestro proyecto será código php añadido en ambas clases, por lo que para conocer la diferencia entre elegir una u otra vía voy a optar por apoyarme en Gii para generar la relación. Para ello seguimos estos pasos:

1. Desde nuestro phpmyadmin, examinamos la tabla city y creamos un índice de la columna country_id para que nos permite a continuación crear la relación:

yiirelationships4

2. A continuación, clicamos sobre la opción Relation View:

yiirelationships5

3. Creamos la relación con la tabla country:

yiirelationships6

4. Desde nuestro navegador volvemos a generar la clase del modelo city, donde, esta vez, Gii nos propone añadir ciertos cambios al código del que ya disponemos:

yiirelationships7

5. Aceptamos y realizamos la misma operación con la clase Country:

yiirelationships8

¡OJO! Recordad que hay que marcar el check junto a la acción overwrite para que sobre escriba o los cambios no serán efectivos.

Pero todo esto funciona?

Bien! Si ya tenemos todo, vamos a ver cómo queda nuestra interfaz de usuario desde la que podemos administrar las entidades del modelo:

País (http://localhost:8888/basic/web/index.php?r=country)

yiirelationships9

Ciudad (http://localhost:8888/basic/web/index.php?r=city)

yiirelationships10

A continuación vamos a crear un par de países y luego un par de ciudades por cada uno para ver si realmente todo queda registrado en nuestra BBDD y disponible para su administración. Vamos con los países:

yiirelationships11

Parece que hemos encontrado un obstáculo en el camino puesto que el formulario de creación de países nos está solicitando introducir un valor para dos campos de tipo fecha en formato texto. La opción ideal en este caso es omitirlos en el formulario ya que es algo que debería almacenarse de forma automática y no manual para que así podamos conocer cuándo han sido creados y cuándo fue la última vez que se modificaron.

Vamos a poner en práctica algo que ya aprendimos en la entrada anterior y vamos a modificar el fichero views/country/_form.php eliminando estos dos campos ara realizar altas de forma sencilla introduciendo únicamente el nombre. Además vamos a aprovechar y hacemos lo mismo con el fichero views/city/_form.php. Quedarían así:

yiirelationships12

De manera que cuando ahora demos de alta un país y nos pida solo el nombre el resultado que esperaremos será similar a este:

yiirelationships13

Vamos a crear un par de ciudades por cada país:

yiirelationships14

Ahora mismo, tal y como el código se ha generado por Gii, tenemos recordar los identificadores de los países con los que queremos asociar las ciudades que vamos creando pero en la siguiente entrada os explicaré de qué forma podemos resolver esto mostrándole al usuario un campo desplegable desde el que elegir el país al que quieren asociar la ciudad. El resultado debe quedar parecido a este:

yiirelationships15

Estos son los países que yo he creado y de forma similar deben verse los vuestros:

yiirelationships16

Y estas son las ciudades:

yiirelationships17

Como veis en el listado de ciudades aparece el identificador del país al que pertenecen y esto no es intuitivo para el usuario, así que como indicaba anteriormente, será el primer tema que abordaremos en la segunda parte de nuestra entrada acerca de Yii y las relaciones entre entidades.

En cuanto al código del proyecto, como siempre os dejo en este repositorio un tag desde donde descargarlo para que podáis utilizarlo como referencia o como plantilla para vuestros proyectos. Fijáis que en la carpeta data he colocado el export del esquema de BBDD.

Hasta la próxima!

Acerca de vicmonmena

Just trying to contribute with my code to make this world easier
Esta entrada fue publicada en Desarrollo web, yii y etiquetada , , , , , . Guarda el enlace permanente.

Una respuesta a Relaciones entre entidades: Parte I

  1. Pingback: Relaciones entre entidades: Parte II | Blog de vicmonmena

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s