No tienes acceso a esta clase

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

Relaciones entre tablas intermedias con viaTable()

33/35
Recursos

¿Cómo se relacionan las tablas en una base de datos mediante otra tabla intermediaria?

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.

¿Cómo implementamos la funcionalidad de cálculo en el modelo?

Al implementar la funcionalidad en el modelo de un autor para obtener el puntaje promedio de sus obras, utilizamos aspectos como:

  • Crear funciones públicas como getScore para calcular y devolver la media.
  • Inicializar variables de suma e índice para calcular el promedio.
  • Utilizar un conteo para validar casos donde no haya votos registrados.
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);
}

¿Cómo conectar relaciones indirectas utilizando código?

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.

¿Cómo se puede mejorar la funcionalidad de votaciones?

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.

¿Qué hace que las funciones de sobrecarga sean poderosas?

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();
}

¿Cómo aplicamos esto en ejemplos prácticos?

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

Ordenar por:

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

Muchachos, en el minuto 8:15 el profe @beca habla de que el agregarle dos funcionalidades a una misma acción es algo que "un arquitecto no aprobaría". ¿Por qué? Porque rompe dos de los principios de SOLID, el principio de responsabilidad única y el de Open/closed ¿Está mal que el profe lo haya hecho así? No, pero lo interesante es combinar lo aprendido en este curso con lo aprendido en otros cursos para volverse mejores programadores. Les recomiento entonces el curso de Patrones de sieño de Mauro Chojin, aquì mismo en Platzi.