Introducción a desarrollo web con PHP y Yii

1

¿Qué es Yii2?

2

¿Por qué usar PHP y Yii2?

3

Arquitectura modelo–vista–controlador

4

Instalación de Yii2

5

Estructura de una aplicación con Yii2

6

Configuración de variables de entorno

Quiz: Introducción a desarrollo web con PHP y Yii

Esquema de la aplicación

7

Proyecto: The Book Club

8

Creación del schema de la base de datos

9

Creación de tablas clubs y club_members

Quiz: Esquema de la aplicación

Modelos, vistas y controladores

10

Commands

11

Model

12

ActiveRecord

13

ActiveRecord de la clase author

14

Relational data: hasOne()

15

Relational data: hasMany()

16

Web Controllers

17

Controller de la clase author

18

Enrutamiento y creación de URLS con urlManager

19

Views

20

Configuración de vistas con Smarty

Quiz: Modelos, vistas y controladores

Manejo de usuarios con Yii2

21

Clase user

22

Autenticación de usuarios

23

Autenticación de usuarios: LoginForm

24

User input

25

Formulario de login con ActiveForm

26

Validación de modelo con core validators

27

Core validators: unique, filter, email

Quiz: Manejo de usuarios con Yii2

Enlaces, navegación y tablas intermedias

28

Dar de alta un libro

29

Asignación de libros a usuario

30

Asignación de libros a usuario: vista

31

Calificar un libro

32

Promedio de calificaciones de libro

33

Relaciones entre tablas intermedias con viaTable()

34

Enlaces y navegación

Quiz: Enlaces, navegación y tablas intermedias

Despliegue y cierre del proyecto

35

Despliegue de aplicación de Yii2 a Heroku

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Relational data: hasMany()

15/35
Recursos

¿Cómo establecer una relación entre un autor y sus libros?

En el mundo del desarrollo web, establecer relaciones entre distintos modelos es fundamental para crear aplicaciones robustas y eficientes. Un reto común es vincular autores con sus respectivos libros. Utilizando frameworks como Yii, este proceso puede simplificarse considerablemente al emplear métodos de relaciones. Pero, ¿cómo se hace? Analicemos cómo podemos, no solo representar estas relaciones, sino también visualizar esos vínculos claramente.

¿Qué métodos de relación se utilizan en Yii?

Cuando trabajamos con modelos en Yii, tenemos varias opciones para establecer relaciones. Uno de los más utilizados para vincular un autor con sus libros es el método hasMany(). Este método resulta esencial cuando un autor puede tener múltiples libros:

public function getBooks()
{
    return $this->hasMany(Book::class, ['authorId' => 'authorId']);
}
  • hasMany(): Este método indica la relación de uno a muchos, donde un autor puede haber escrito múltiples libros. Se especifica que el authorId del modelo Book se relaciona con el authorId del modelo de Author.

¿Cómo mostramos en pantalla los libros de un autor?

Una vez establecida la relación, podemos visualizarlos de manera sencilla. Queremos que al imprimir un autor, se muestre no solo su nombre, sino también la cantidad de libros que ha escrito. Esto se logra extendiendo el método toString en la clase de Author:

public function __toString()
{
    return sprintf('%s (%d)', $this->name, count($this->books));
}

Este enfoque hace uso del método count() sobre el arreglo de libros del autor, mostrando claramente cuántos libros posee.

¿Cómo accedemos a propiedades inexistentes en la base de datos?

Uno de los aspectos más fascinantes de Yii es su capacidad de manejar propiedades que no están presentes físicamente en la base de datos. Esto se logra mediante el uso de los getters, permitiendo obtener y generar propiedades en tiempo real. Por ejemplo, si quisiéramos representar una bandera basada en la nacionalidad, podríamos utilizar un método como el siguiente:

public function getFlag()
{
    return 'flags/' . $this->nationality . '.png';
}

Llamar this->flag es equivalente a invocar this->getFlag(), haciendo que la propiedad parezca parte natural del objeto.

¿Cómo mostramos todos los libros de un autor?

Para imprimir en la terminal los títulos de cada libro de un autor específico, la lógica de Yii nos permite recorrer fácilmente la relación:

foreach ($author->books as $book) {
    printf(" - %s\n", $book->title);
}

Este ciclo itera sobre cada libro asociado al autor y muestra su título en pantalla, ejemplificando una práctica común de visualización de datos.

¿Qué más podemos hacer con estas relaciones?

Con estas herramientas, podemos no solo listar los libros de un autor, sino también realizar búsquedas avanzadas, como aquellos con ciertas características o que no estén prestados. La capacidad de construir estas relaciones en nuestros modelos es esencial para capturar, procesar y presentar datos de manera efectiva.

Las relaciones entre modelos son clave para desarrollar aplicaciones que escalen y se adapten a nuestros requerimientos. A medida que te adentras más en este mundo, recuerda que cada relación que creas es una pieza crucial para armar un sistema de datos coherente y enriquecedor para tus usuarios. ¡Sigue explorando y ampliando tus conocimientos en esta emocionante área del desarrollo web!

Aportes 2

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Estoy asombrado al ver la arquitectura del proyecto que estamos construyendo !!! ![](https://static.platzi.com/media/user_upload/image-045a62b8-9292-4ded-a24f-128924896beb.jpg)
```js // Ajaa moment ! En php el tema de los setters y los getters // en otro framework a esto se le llama mutators. class Author extends ActiveRecord {     /*     |--------------------------------------------------------------------------     | GLOBAL VARIABLES     |--------------------------------------------------------------------------     */ public static function tableName() { return 'authors'; } public function getId() { return $this->id; }     /*     |--------------------------------------------------------------------------     | FUNCTIONS     |--------------------------------------------------------------------------     */ public function toString() { return sprintf("%s (%s)", $this->name, count($this->books)); }     /*     |--------------------------------------------------------------------------     | RELATIONS     |--------------------------------------------------------------------------     */ public function getBooks() { return $this ->hasMany(Book::class, ['author_id' => 'id']) // esta es la relacion book.author_id / author.id ->all(); }     /*     |--------------------------------------------------------------------------     | MUTATORS     |--------------------------------------------------------------------------     */ public function getFlag() { return sprintf("flags/%s.png", $this->name, $this->nationality); } } ```