Relaciones entre entidades en Laravel 5

Un ORM puede llegar a ser una herramienta maravillosa, hace tiempo creia que no, pero la experiencia me ha demostrado que si, que es realmente interesante su uso porque puede ahorrarnos mucho tiempo. El problema está en que a veces puede convertirse en algo engorroso su uso, porque a veces necesitas lanzar consultas muy complejas o por que la configuración del propio ORM es laboriosa, podríamos poner como ejemplo Doctrine.

En el caso de Laravel, Eloquent ORM es un ORM realmente sencillo y rápido de hacer funcionar, prácticamente no hay que hacer nada y es una verdadera maravilla usarlo, es mágico.

Hoy vamos a ver como hacer relaciones entre entidades en Laravel 5, esto es lo que realmente hace grande a los ORM, el poder relacionar tus clases y luego la forma de enlazar los objetos unos entre otros para hacer mas cómodo y rápido el desarrollo.

Tenemos dos entidades Peliculas y Cineastas.

Relación One to Many

Vamos a establecer una relación One to Many (Uno a Muchos) para que cuando tengamos un objeto Cineasta podamos sacar de el todas las películas de este.

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Cineasta extends Model {

	protected $table = 'cineastas';

	/**
	 * The attributes that are mass assignable.
	 *
	 * @var array
	 */
	protected $fillable = ['nombre', 'edad'];

	/**
	 * The attributes excluded from the model's JSON form.
	 *
	 * @var array
	 */
	protected $hidden = ['created_at', 'updated_at'];
        
        // Relación
        public function peliculas()
        {
            return $this->hasMany('App\Pelicula');
        }

}

Relación One to One

Ahora crearemos una relación One to One (de uno a uno) para que cuando tengamos un objeto Pelicula podamos sacar de él su cineasta.

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Pelicula extends Model {

    protected $table = 'peliculas';
    protected $fillable = ['titulo', 'descripcion', 'anio'];
    protected $hidden = ['cineasta_id', 'created_at', 'updated_at'];

    // Relación
    public function cineasta() {
        return $this->hasOne('App\Cineasta', 'id'); // Le indicamos que se va relacionar con el atributo id
    }

}

Relaciones en acción

Ahora ya podemos usar las relaciones, por ejemplo en un controlador.

    public function getIndex() {
        echo "<h2>Relación uno a muchos</h2>";
        
        // Conseguimos el cineasta con ID número 2
        $cineasta=Cineasta::find(2);
        var_dump($cineasta->nombre);
        var_dump($cineasta->edad);
        
        // Peliculas de este cineasta
        foreach($cineasta->peliculas as $pelicula){
            var_dump($pelicula->titulo);
        }
      
        echo "<hr/>";
        echo "<h2>Relación uno a uno</h2>";
        
        // Conseguimos la pelicula con ID número 2
        $pelicula=Pelicula::find(2);
        var_dump($pelicula->titulo);
        var_dump($pelicula->anio);
        
        // Nombre del cineasta de esta película
        var_dump($pelicula->cineasta->nombre);
        
    }

Así de simple.

relaciones entre entidades en Laravel 5

Más información:
http://laravel.com/docs/5.0/eloquent#relationships

Victor

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post

2 Comentarios

  1. amigo muy buen artículo si quisiera traer todo de una ves en ves de uno como se hace?

    Responder
    • Usando el método all() y recorriendo todos los resultados con un foreach. Saludos 😉

      Responder

Poner un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *