Introducción a desarrollo web con PHP y Yii
¿Qué es Yii2?
¿Por qué usar PHP y Yii2?
Arquitectura modelo–vista–controlador
Instalación de Yii2
Estructura de una aplicación con Yii2
Configuración de variables de entorno
Quiz: Introducción a desarrollo web con PHP y Yii
Esquema de la aplicación
Proyecto: The Book Club
Creación del schema de la base de datos
Creación de tablas clubs y club_members
Quiz: Esquema de la aplicación
Modelos, vistas y controladores
Commands
Model
ActiveRecord
ActiveRecord de la clase author
Relational data: hasOne()
Relational data: hasMany()
Web Controllers
Controller de la clase author
Enrutamiento y creación de URLS con urlManager
Views
Configuración de vistas con Smarty
Quiz: Modelos, vistas y controladores
Manejo de usuarios con Yii2
Clase user
Autenticación de usuarios
Autenticación de usuarios: LoginForm
User input
Formulario de login con ActiveForm
Validación de modelo con core validators
Core validators: unique, filter, email
Quiz: Manejo de usuarios con Yii2
Enlaces, navegación y tablas intermedias
Dar de alta un libro
Asignación de libros a usuario
Asignación de libros a usuario: vista
Calificar un libro
Promedio de calificaciones de libro
Relaciones entre tablas intermedias con viaTable()
Enlaces y navegación
Quiz: Enlaces, navegación y tablas intermedias
Despliegue y cierre del proyecto
Despliegue de aplicación de Yii2 a Heroku
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Comencemos con un aspecto crítico en la administración de bases de datos: relacionar tablas a través de una tabla intermediaria. A menudo, en lugar de una relación directa, se requiere utilizar otra tabla que actúe como puente. Un ejemplo común es calcular el promedio de las calificaciones de las obras de un autor. Aquí, 'autor' se relaciona con 'libro', y luego 'libro' se conecta con 'votos'. Esta estrategia permite agregar complejidad y flexibilidad a la estructura.
Al implementar la funcionalidad en el modelo de un autor para obtener el puntaje promedio de sus obras, utilizamos aspectos como:
getScore
para calcular y devolver la media.public function getScore()
{
$i = 0;
$sum = 0;
foreach ($this->votes as $vote) {
$i++;
$sum += $vote->score;
}
return $i === 0 ? 'Sin votos' : sprintf("%.2f con %d votos", $sum / $i, $i);
}
En este ejemplo, un autor se conecta con votos a través de sus libros. Implementamos esta relación usando la función viaTable
. Esto permite definir la conexión lógica y obtener el conjunto de votos asociados.
public function getVotes()
{
return $this->hasMany(BookScore::class)->viaTable('books', ['author_id' => 'author_id']);
}
Esta implementación relaciona las tablas efectivamente, optimizando consultas y manejo de datos, al aprovechar las características intrínsecas de los ORMs modernos.
Para un manejo más avanzado, podemos implementar sobrecargas de funciones. Esto permite que una función, como getVotes
, pueda tomar parámetros opcionales, aumentando su flexibilidad.
Al añadir un argumento, como bookId
, a una función existente, podemos especificar consultas y afinar la información devuelta.
public function getVotes($bookId = null)
{
$query = $this->hasMany(BookScore::class)
->viaTable('books', ['author_id' => 'author_id']);
if (!empty($bookId)) {
$query->andWhere(['book_id' => $bookId]);
}
return $query->all();
}
Con el uso adecuado de argumentos, logramos extraer datos específicos como promedio de votos de un único libro bajo un autor, comparado con todos los libros del autor.
$getScoreForBook = function ($bookId) {
$votes = $this->getVotes($bookId);
if(empty($votes)) return "Sin votos";
$sum = array_sum(array_column($votes, 'score'));
return sprintf("%.2f con %d votos", $sum / count($votes), count($votes));
};
Esta flexibilidad empodera a los desarrolladores para manejar datos complejos con menos código y más eficiencia.
¡La programación se parece a resolver un rompecabezas! La sistematización de datos a través de relaciones es uno de los motores propulsores hacia una base de datos robusta y altamente funcional.
Aportes 1
Preguntas 1
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?