Primeros pasos con Elquent

Vídeo


Una de las cosas que más suelen impresionar a los principiantes de Laravel es Eloquent, el ORM incluido el Laravel. Gracias a él podemos hacer la mayoría de nuestras consultas a la base de datos sin una sola línea de SQL con un código muy limpio y elegante.

¿Qué es ORM? Son las siglas en inglés de Object Relational Mapping. Consiste en acceder a una base de datos a través de objetos.

Para ver la potencia y lo mucho que nos simplifica la vida Eloquent vamos a empezar por ver qué es lo que podemos hacer con él.

Imaginemos una base de datos con dos tablas: noticias y comentarios.

La tabla noticias podría tener los campos:

  • id
  • titulo
  • cuerpo

La tabla comentarios tendría los campos:

  • id
  • comentarios
  • noticia_id (este campo se usaría para asociar el comentario con su correspondiente noticia)

Buscar el título de la noticia con el id 3 sería tan fácil como hacer:

$noticia = Noticia::find('3');
echo $noticia->titulo;

Y si queremos ver los comentarios de la noticia tan sólo habría que hacer:

$comentarios = $noticia->comentarios;

¿Quieres modificar el título de la noticia?

$noticia->titulo = “Nuevo título”;
$noticia->save();

Ahora compara ésto con todas las líneas de código que tendrías que usar con las extensiones MySQL, MySQLi o incluso PDO.

Eloquent nos permite trabajar con registros y tablas como si fueran objetos. Él se encarga de generar las consultas a la base de datos sea cual sea la que usemos.

Requisitos

Para seguir este capítulo necesitarás:

  • Una instalación de Laravel con acceso a una base de datos.
  • Artisan funcionando correctamente.

Y los siguientes conocimientos:

  • ¿Qué es una migración?
  • Trabajar con Artisan
  • Trabajar con Tinker.

Nuestro primer modelo

La base de Eloquent son los modelos. Un modelo es una clase que estará asociada a una tabla de la base de datos.

Un modelo se puede crear desde Artisan:

php artisan make:model Noticia --migration

Este comando nos va a crear dos archivos mágicamente:

  • app/Noticia.php (el modelo).
  • 2016_06_01_173482_create_noticias_table.php (el fichero de la migración).

Vamos a revisar el fichero de la migración:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateNoticiasTable extends Migration
{
    public function up()
    {
        Schema::create('noticias', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('noticias');
    }
}

Como ya sabrá este fichero contiene la información necesaria para crear la tabla “noticias”. Vamos a añadir los dos campos que faltan en la función up:

$table->string('titulo', 200);
$table->text('cuerpo');

Ahora ya podemos hacer la “migración” desde la consola:

php artisan migrate

Y ya tendremos creada la tabla en nuestra base de datos.

Ahora vamos a ver el fichero Noticia.php:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Noticia extends Model
{
    //
}

Como ves el fichero está prácticamente vacío. ¡Vaya chasco! No pasa nada; ya vas a ver todo lo que podemos hacer con ese poco código.

Ve a la consola y abre una sesión con Tinker:

php artisan tinker

NOTA: Por si aún no la has probado Tinker es una herramienta que viene con Laravel que nos permite hacer experimentos y probar código sin tener que andar creando controladores, rutas y vistas.

Los comandos que hay que muestro a continuación se teclean dentro de la consola Tinker.

Carga la clase noticia:

use App\Noticia;

Ahora vamos a crear nuestra primera noticia:

$noticia = new Noticia;

Ahora ya tenemos un objeto llamado noticia que es un registro “virtual” de la tabla “noticias”. Vamos a añadirle un título:

$noticia->titulo = 'Mi primera noticia';

y el cuerpo de la noticia:

$noticia->cuerpo = 'Estoy realmente emocionado';

¿Y qué es lo que ha pasado? Pues vamos a examinar el objeto $noticia:

dd($noticia)

Nota: dd() es una función muy útil que muestra el contenido de una variable de manera elegante y termina el programa actual (de ahí su nombre “dump and die”).

En este caso nos mostrará algo como:

App\Noticia {#664
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  #perPage: 15
  +incrementing: true
  +timestamps: true
  #attributes: array:2 [
    "cuerpo" => "Estoy realmente emocionado"
    "titulo" => "Mi primera noticia"
  ]
  #original: []
  #relations: []
  #hidden: []
  #visible: []
  #appends: []
  #fillable: []
  #guarded: array:1 [
    0 => "*"
  ]
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  #morphClass: null
  +exists: false
  +wasRecentlyCreated: false
Aquí hay información muy útil pero por ahora un poco confusa ¿no? Para ver lo que nos interesa de manera más clara vamos a usar el método toArray() que nos convierte el objeto Noticia en un array. Este método está disponible en todos los modelos de Eloquent:
dd($noticia->toArray());
y el resultado es:
array:2 [
  "cuerpo" => "Estoy realmente emocionado"
  "titulo" => "Mi primera noticia"
]

Mucho más claro ahora. Vemos que el objeto noticia tiene las dos propiedades que queríamos. Pero también podemos ver que falta el campo id.

Esto sucede porque aún no hemos guardado el registro en la base de datos. Vamos a guardarlo:

$noticia->save();

¿Qué ha pasado con el objeto noticia? Vamos a ver su contenido otra vez:

dd($noticia->toArray());

que mostrará:

array:5 [
  "titulo" => "Mi primera noticia"
  "cuerpo" => "Estoy realmente emocionado"
  "updated_at" => "2016-08-10 18:26:58"
  "created_at" => "2016-08-10 18:26:58"
  "id" => 1
]

Ahora sí, mágicamente han aparecido otros campos: id, created_at y updated_at.

Si ahora consultásemos la base de datos veríamos que, efectivamente, hay un nuevo registro.

¿Y qué pasaría si añadiésemos un campo que no existe? Por ejemplo:

$noticia->campo_inexistente = 'Cualquier valor';

Aparentemente no hay ningún problema. Vamos a guardar el registro a ver qué pasa:

Illuminate\Database\QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'campo_inexistente' in 'field list' (SQL: update `noticias` set `updated_at` = 2016-08-10 21:55:08, `cuerpo` = Estoy realmente emocionado, `campo_inexistente` = Cualquier valor where `id` = 2)'

Aquí es donde surge el problema. La consulta a la base de datos que genera Eloquent incluye todos los campos que hemos metido.

En el próximo capítulo voy a explicar cómo usar Eloquent en una aplicación “real”.

Autor:
Nivel: Principiante
Palabras clave:
Fecha publicado:
Fecha actualizado: 13-09-2016

Otros capítulos de la misma serie

Este capítulo es parte de la serie: Eloquent.

Y muchos más en preparación.

Disponible en los planes: Laravel hero