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.
Más información:
http://laravel.com/docs/5.0/eloquent#relationships