Esta clase si me decepcionó, no tiene una buena explicación y es mucho código sin sentido.
Dejo el repositorio del proyecto con Laravel 8:
https://github.com/RetaxMaster/platzi-api/commit/b0efbf712f5b2580a758fe25a8b6cfb09440d385
Laravel y Base de Datos
Entorno de trabajo y repaso de Laravel
Qué aprenderás sobre Laravel Avanzado
Repaso de Laravel y requisitos del curso
Configuración de la base de datos-SQLite en Laravel
Instalación, configuración y uso de Homestead
Instalar Laravel Sanctum
API de autenticación: laravel UI y laravel sanctum
Manejo de tu base de datos con Laravel
Capa de transformación con API Resources
Manejo de relaciones en bases de datos con Laravel
Relaciones Polimórficas en Eloquent
La terminal de Laravel
Cómo crear comandos para la terminal de Laravel
Ejecutando comandos desde la API
Programación de tareas
Eventos y tareas de Laravel
Eventos y Listeners en Laravel
Eventos de Eloquent
Introducción al uso de Queues y Jobs
Cómo disparar eventos en Queues
Laravel Horizon
Manejo de errores
Cómo capturar y leer errores con la clase Handler
Excepciones personalizadas
Excepciones HTTP personalizadas y debugging con Laravel Telescope
Configuración de logs y channels en Laravel
El corazón de Laravel
Ciclo de vida de una aplicación en Laravel
¿Qué son los service containers?
¿Cómo funciona un service container?
Registro y carga de clases con service providers
Creación de paquetes
¿Cómo crear mis propios paquetes de Laravel?
Propiedades para manejo de dependencias
Comprende el archivo composer.json
Extendiendo composer.json, autocarga de clases y PSR-4
Crear mis propios Services Providers
Publicación de archivos
Uso de repositorios locales
Publicación de paquetes en packagist
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Convierte tus certificados en títulos universitarios en USA
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Sergio Ojeda
Aportes 33
Preguntas 1
Esta clase si me decepcionó, no tiene una buena explicación y es mucho código sin sentido.
Dejo el repositorio del proyecto con Laravel 8:
https://github.com/RetaxMaster/platzi-api/commit/b0efbf712f5b2580a758fe25a8b6cfb09440d385
Ok, voy a intentar dar mi explicación de lo que está pasando en esta clase, es importante tener en cuenta que se establecerá una relación polimorfa muchos a muchos (MaM) por lo que tienen que tener nociones de la relación MaM, para entender las relaciones polimorfa les dejó el siguiente video que encontré dentro de los aportes de esta clase y utiliza un ejemplo de relaciones polimorfas uno a muchos: relaciones polimorfas uno a muchos.
.
Primera parte - Relación a establecer
Primero que nada hay que entender que es lo que vamos a relacionar a nivel de base de datos, esto es una entidad que pueda calificar (un usuario, un invitado, una sesión, etc) con una entidad que pueda ser calificada (producto, categoría, etc.), como muchos usuarios podrían calificar muchos productos y muchos productos podrían ser calificados por muchos usuarios vemos que se forma una relación MaM, según teoría de bases de datos relacionales, esta relación se puede alcanzar mediante tres tablas - una tabla usuarios, una tabla productos y una tabla intermedia o pivote ratings.
.
Segunda parte - Migración de tabla Ratings
Esta tabla tendrá 5 columnas importantes, el score, rateable_type, rateable_id, qualifier_type y qualifier_id, los últimos cuatro pueden inferirse por las instrucciones $table->morphs('rateable')
y $table->morphs('qualifier')
. Así que, ¿qué significan esas columnas?, bueno si vieron el video del inicio de mi comentario espero hayan entendido que se rateable_type y qualifier_type hacen referencia al modelo que recibe calificación y al modelo que dictó dicha calificación, respectivamente - y rateable_id/qualifier_id hacen referencia a el registro especifico dentro de la tabla de cada type que recibe/dicta la calificación.
.
Tercera parte - Modelo Rating
El modelo Rating extenderá de Pivot y no de Model puesto que como ya expliqué nuestra tabla es una de tipo intermedia o pivote, no se porqué se indica el uso de campos auto-incrementables (lo siento 😦), y se indica la tabla a la que nos relacionaremos. Después es como definir cualquier relación de Laravel, tenemos que indicar el nombre del método para acceder a la relación y retornar la relación polimorfa que no toma argumentos porque como puede relacionarse a varios Modelos la función MorphTo se encarga de determinarlo.
.
Cuarta parte - Previo al Trait Can Rate
Aquí es donde el titulo avanzado del curso toma sentido jeje, en un sistema diferente a este (llamemosle un sistema normal) lo que se haría sería establecer la otra parte de la relación polimorfa en los modelos específicos, por ejemplo en el caso del modelo User describiríamos la relación de la siguiente forma:
public function ratings()
{
return $this->morphMany( 'App\Models\Rating', 'qualifier' );
}
lo cual le indicaría a Laravel como establecer la relación polimorfa desde Usuario con Rating. En un sistema como el del profe (llamemoslo un sistema avanzado) quisiéramos “volverlo más flexible” citando a Sergio, por lo que podemos tomar ventaja de los Traits para delegar la responsabilidad de establecer la otra parte de la relación polimorfa a una clase en especifico y así poder darle la posibilidad a cualquier clase que queramos de poder calificar, si quieren saber más acerca de que es, como hacer y como usar un Trait les dejo el siguiente enlace: Traits.
.
Quinta parte - Trait Can Rate
Bueno, ahora que entendemos un poco la motivación de porque se usará un Trait esta parte es la que más me costó jeje,el método ratings de la clase CanRate es lo que referí como la otra parte de la relación polimorfa ya que se encargará de relacionar el modelo que le pasen por parámetro dentro de la tabla ratings usando el qualifier_id y rateable_id como llaves foráneas para después retornar los ratings (con timestamps) donde el rateable_type sea el modelo objetivo y el qualifier_type sea el modelo que invoco la relación.
Bueno, ahora ¿Cómo invocaremos la relación? con el método rate del trait CanRate, lo que hace éste método es tomar dos parámetros, modelo y calificación, el primero hará referencia que modelo se va a calificar con el puntaje que se pasa en calificación, por lo que al momento de invocar la relación ratings del Trait CanRate podemos encadenar el método attach (más información del método attach) para básicamente indicar que se escriba en la tabla pivote el id que tenga el modelo relacionado al score ya antes mencionados.
.
espero haberles ayudado y no confundido más, jeje.
Si saben ingles este es una muy buena explicación de las relaciones polimórficas: https://www.youtube.com/watch?v=rx1DQBE01b0
Por más avanzado que sea un curso, a este le falta demasiada planeación, estructuración y enriquecimiento de conceptos del framework. Es importante resaltar que el profesor es bueno pero se nota que el TEAMPLATZI sacó este curso de afán.
A este curso le falta más amor.
Links al ejemplo mas sencillo de relaciones polimorficas: https://laravel.com/docs/7.x/eloquent-relationships#polymorphic-relationships
He hecho ya alguna vez de relaciones polimórficas de muchos a muchos y les aseguro que no es tan complejo, además, el profesor no sigue convenciones que recomienda laravel, y aunque no sea algo obligatorio es una línea que se sigue para no desorientar a muchas personas que vienen por esa línea. LA VERDAD MUY DECEPCIONANTE ESTE CURSO, EL DE API REST BASICO FUE MUCHO MAS INTERESANTE GRACIAS AL PROFESOR QUE SE ESMERÓ EN EXPLICAR DE FORMA CLARA
a este punto no sé si dejar el curso aquí e ir a tomar el de Eloquent y luego regresar … o continuar …
La verdad es que he tenido que arreglar muchos errores, por que el profesor se salta mucho código y recurrir a repositorios de los que ya han hecho este curso para entender bien… y este tema tan enredado que me dan ganas de dejar el curso hasta aqui…
que complejo me ha parecido
Excelente explicación! Creo que para poder entender esta clase, la audiencia debe tener conocimientos no solo de cómo usar la mágia de laravel, si no, POO y manajar muy bien las relaciones en laravel.
Muy mala Clase, empezó bien con la explicación, pero al parecer se había extendido mucho y le toco hacer copy-paste, lo malo es la falta de explicación de algunos de estos códigos.
a pesar de ser un curso Avanzado se debería de tomar el tiempo de poder explicar cada cosa que pone en el código.
Sobre el reto, > hacer que los usuarios se puedan calificar entre ellos:
El modelo user debe usar los dos traits creados:
class User extends Authenticatable
{
use CanRate;
use CanBeRated;
y he aqui un posible test para dicha funcionalidad:
public function test_a_user_can_rate_another_user()
{
$user1 = User::factory()->create();
$user2 = User::factory()->create();
$user1->rate($user2, 10);
$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $user1->ratings(User::class)->get());
$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $user2->qualifiers(User::class)->get());
}
para quienes tengan dificultades aca el profesor italo morales explica de forma sencilla https://www.youtube.com/watch?v=uT-2pB43vXM
Hola, si se encuentran algo desorientados les dejo el siguiente enlace que explica con un ejemplo sencillo qué es, como se crea y como usar un Trait en Laravel:
jaja es la primera vez que veo estas relaciones polimórficas en laravel se me complica mucho, pero esta muy interesante así que terminare aprendiendo y a dominar este tema si o si
esta clase daba para tres o cuatro videos 😕 al final no esta bien explicado por querer meter todo en un solo video
El problema que veo aqui es que no sigue las convenciones de laravel
Las relaciones polimorficas permite que un modelo se relacion a varios otrso modelos
jaja nunca me habia planteado un relación polimórfica!Gran dato, gracias!!
En esta clase se habla de una relacion polimorfica muchos a muchos:
Un usuario -->> puede calificar varios productos.
Un producto -->> puede ser calificado por varios usuarios
Recomendacion, seguir la documentacion de laravel.
Y entender primero como se hace la relacion polimormica muchos muchos, de manera simple como la documentacion indica, (en el ejercicio de la clase es raitings) y como hacer su relacion inversa (en la clase la relacion inversa seria qualifiers).
Despues de tener claridad en ese tema, ahora si introducir el uso de los traits para lograr una relacion que no solo sea aplicada entre usuarios y productos, sino que pueda ser extendida a sesiones y paginas o usuarios y categorias, etc.
Para una tabla pivot es mejor usar relaciones polimorficas y crear un treat que permita a las demas tablas relacionarse de manera sencilla y simple.
Esta clase no estuvo bien planeada. Hay muchas porciones de código sin explicación
Muy mal estructurada la clase, le falta mas aclaración del codigo el uso de los traits,etc.
La verdad hasta el momento no me he sentido cómodo y a gusto con este curso, hay demasiadas cosas inconclusas, la explicación no es muy buena. Al descargar ciertos elementos, generan error por falta de dependencias que no se comentaron, le falta estructura al curso.
Recomiendo estos dos videos en espanol para comprender las relaciones polimorficas:
Aqui se justifica el titulo curso avanzado, muy buen contenido.
Que tal chicos para todos aquellos que llegaron acá y no entienden nada…
1.- Al principio del curso se dijo que es importante que ya tengas experiencia con Laravel… razón por la cual supongo que el profe omite muchas cosas no lo justifico pero lo entiendo…
2.- Para entender esta clase primero hay que saber de los siguientes temas
A) Relaciones polimórficas 1 a 1,1 a N y N a N( que es la que se usa en esta clase)
B) Traits
C) Test
Cuando yo tome este curso hace mas de 6 meses me frustre mucho, pero acababa de terminar el curso de introducción a Laravel y los recursos de Laravel disponibles aquí en Platzi, de echo considero que mas bien hizo falta entrar mas a detalle a todos los tipos de relaciones que soporta Laravel, la verdad es que el único ‘problema’ que encuentro de este video en particular es que puede ser complicado de entender incluso para alguien con experiencia, la ventaja es que reduce mucho el código, entonces es ahí donde uno debe tomar la decisión de usar Traits para este tipo de relaciones que reducen el código, o escribir mas código en los modelos involucrados que haría mas fácil de entender lo que esta pasando
Me he quedado al principio, después de acabar la migración ya no entendí nada xD
https://www.youtube.com/watch?v=25e24tSawwQ&list=PLhCiuvlix-rT96yLQTTr3-eTZl6sbhVte&index=6
Relación muchos a muchos
estas clases están retadoras (de entender a la primera)! 😖 … bueno, el curso es avanzado 🤔 … pensemos que está diseñado correctamente para retar a los estudiantes … 😬
No sé, pero creo yo que puede haber otra manera de usar las relaciones polimorficas para lograr el mismo objetivo.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?