Aprende eloquent con ejemplos!!!
Tags: php, laravel, tutorial, eloquent
Published: 2021-04-11 20:52:46

*Una serie de artículos basados e inspirados en el curso [EloquentbyExample](https://eloquentbyexample.com/) del desarrollador Jeff Madsen(@codebyjeff), dirigidos a ilustrar el uso de eloquent, famoso ORM usado por laravel para la interacción con bases de datos.*

Bienvenidos a este nuevo proyecto que inicio con muchas ganas y entusiasmo, siempre he querido retribuir de alguna manera el conocimiento que he adquirido en la red, a través de publicaciones, cursos, tutoriales y un sin fin de material que, con el ánimo solo de compartir, transmitir y nutrir a la comunidad de desarrolladores, muchos de sus integrantes han elaborado de manera desinteresada, por lo que me siento orgulloso hoy día de unirme a ellos con este pequeño pero importante aporte.

Antes de entrar de lleno con el contenido que pretendo desarrollar a lo largo de esta serie de publicaciones, quiero dar un agradecimiento y un reconocimiento a Jeff Madsen, por haberme permitido tomar su curso [EloquentbyExample](https://eloquentbyexample.com/) como base para la elaboración del contenido de este proyecto, pues fue este curso el detonante que necesité para atreverme a dar este paso. Gracias Jeff!!!

Pues bien, hechos los respectivos agradecimientos y las aclaraciones pertinentes, entremos en materia y demos comienzo a este pequeño curso.

Empecemos por dar un poco de contexto, diciendo que tenemos una aplicación para un centro veterinario en el que necesitamos registrar todos los caninos que ingresan, para esto, nuestro jefe nos ha indicado agregar un módulo "dogs" (aunque el curso es una adaptación al español, es mejor mantener las buenas prácticas de codificar en inglés), por lo que tendremos que configurar la base de datos y dejar todo listo para lo que se construirá más adelante. Debemos comenzar por crear la tabla de una manera que se pueda agregar fácilmente a los servidores locales y compartidos de los otros desarrolladores, así como al modelo eloquent.


>Nota: Laravel viene con una configuración para la base de datos ya predefinida que no debería darte problemas, sin embargo te dejo el enlace por si necesitas hacer alguna configuración adicional [Database: Getting Started - Laravel](https://laravel.com/docs/8.x/database#configuration).



##Migraciones:

El primer paso que debemos dar en laravel para crear nuestra tabla es crear una migración, para lo cual ejecutaremos un simple comando en nuestra consola: 

~~~
php artisan make:migration create_dogs_table
~~~

Simple ¿verdad?. Este sencillo comando nos genera un archivo en la ruta */database/migrations*, si vamos ahí encontraremos un total de cuatro archivos, tres de ellos ya vienen con laravel por defecto, el cuarto es el archivo que hemos creado.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c2oh1j6392tfrpstqvfq.png)
 
Así de fácil hemos creado nuestra primera migración, pasemos ahora a abrir el archivo, veremos que en realidad trae muy poco, apenas un par de funciones, `up()` y `down()`, totalmente vacías, y si revisamos nuestra base de datos, no tenemos nada!!!

Hasta ahora lo único que hemos hecho es crear un archivo de “andamiaje básico” para contener la información que se convertirá en una declaración `CREATE TABLE`, con un comando separado pero similar, llamado `migrate`. Ahora bien, cuando los desarrolladores comenzamos a trabajar con migraciones, no tenemos una noción clara sobre estas diferencias, por lo que terminamos "arreglando" un montón de cosas manualmente, haciendo un total desastre.

Es importante que tengamos claro que este archivo mantendrá nuestra información de creación de tablas, por lo que podemos hacer los cambios que queramos, incluso borrarlos, sin consecuencias, mientras no ejecutemos el comando real `php artisan migrate`, encargado de recorrer todos los archivos *migrations* y crear así nuestras tablas.

Entendido lo anterior, vamos ahora a crear nuestra migración como es debido, así que, eliminemos el archivo para que podamos hacer una mejor versión y ejecutemos el siguiente comando:

```php
php artisan make:migration create_dogs_table --create=dogs
```

Si te fijas hemos agregado `--create=dogs`, ahora en nuestro archivo, encontraremos que se han agregado algunas líneas más de código, aportan utilidad a las funciones `up()` y `down()`. En la primera de estas creamos nuestra tabla, con la segunda revertimos la instrucción anterior. Agreguemos entonces un campo a nuestra migración, de tal manera que nuestro archivo se verá así:

```php
public function up()
{
    Schema::create('dogs', function (Blueprint $table) {
        $table->id();
        $table->string(‘name’);
        $table->timestamps();
    });
}

public function down()
{
    Schema::dropIfExists('dogs');
}
```
Ejecutemos ahora el comando `php artisan migrate`, y busquemos ahora en nuestra base de datos, encontraremos que se han creado las tablas correspondientes.

Hasta ahora no hemos ahondado en el tema de las migraciones, pues el desarrollo completo de este particular escapa del ámbito de lo que se pretende plasmar en el curso, pero si quieres profundizar más sobre el tema te invito a revisar [la documentación de laravel](https://laravel.com/docs/8.x/migrations), quizás en otra oportunidad haga una serie dedicada solo al tema de las migraciones, pero, por lo pronto, quedémonos con lo explicado y veamos algunas cosas importantes antes de pasar a la siguiente tarea.

1. Borrar el archivo migration no afecta nuestra tabla de manera directa, por ende, no implica que se borre nuestra tabla.
2. Al crear el archivo migration puedes asignarle cualquier nombre al flag `--create`, pero es una convención establecida (y recomendada) que se escriba en minúscula y en plural (salvo algunas excepciones como tablas pivote).
3. Se recomienda el uso de `php artisan migrate:rollback` si necesitas devolver una ejecución previa de `migrate`. También puedes usar `php artisan migrate:refresh` para reiniciar tu base de datos.

##Seeders

Pasemos ahora a nuestra siguiente tarea, necesitamos trabajar con datos limpios y sin duplicados, pues esto facilitará, entre otros aspectos, a la detección de errores.

La respuesta a esto es **Seeders** - un conjunto especial de clases que nos permiten rellenar nuestra base de datos una y otra vez con los mismos datos exactos.

Vamos a aprender en la próxima entrega cómo hacer algunos sembradores realmente poderosos para producir grandes datos de desarrollo y pruebas, pero hoy ya se está haciendo un poco largo, así que vamos a presentar la idea. Un "**Seeders**" es simplemente una clase que rellena la base de datos con su información respectiva. Lo bueno de ellos es que puedes usar una instrucción de línea de comandos simple para actualizar los datos, por lo que después de haber estado trabajando durante un tiempo puedes limpiarlo y empezar de nuevo. También te permite evitar nombres como "*assdffggggg*" y otros datos sucios que pueden causar algún bug.

Vayamos a la línea de comandos y escribamos:

```php
php artisan make:seeder DogsTableSeeder
```

Este comando creará un archivo en `/database/seeders`, vamos ahí y abramos el archivo, veremos una clase muy simple con un único método llamado `run()`. No hay nada mágico en esta clase, es realmente poco más que un envoltorio alrededor de una clase de comando de consola, hecho específicamente para ayudar con esta tarea en particular. Vamos a comprobarlo  nosotros mismos añadiendo lo siguiente:

```php
public function run()
{
    echo 'Sembrando datos!';
}
``` 

y luego de vuelta a la línea de comandos:

```php
php artisan db:seed --class=DogsTableSeeder
```

Está llamando desde la facade `DB`, pero no hay ninguna interacción real de la base de datos aquí. Vamos a poblar la tabla ahora con un par de perros:

```php
public function run()
    {
        DB::table('dogs')->insert(['name' => 'Joe']);
        DB::table('dogs')->insert(['name' => 'Jock']);
        DB::table('dogs')->insert(['name' => 'Jackie']);
        DB::table('dogs')->insert(['name' => 'Jane']);
    } 
```

Ahora ejecutemos de nuevo `php artisan db:seed --class=DogsTableSeeder`, verás que nuestra tabla tendrá cuatro caninos dentro de sus registros.

Si nos fijamos bien, trabajando de esta manera podremos eliminar, agregar y/o editar nuestros perros mientras trabajamos, y luego con un simple comando restablecerlos a un estado inicial, sin embargo, hay algunas mejoras que podemos hacerle a este código, una de ellas es que, de la forma que lo hemos planteado, debemos ser nosotros quienes elegimos los nombres, algo que se hace fácil si solo son unos pocos registros, pero, si nos toca hacerlo con unos 500 perros la tarea no se hace tan divertida ¿cierto?.

Por otra parte imaginemos ¿qué pasaría si tenemos otra lógica que queremos que suceda en el tiempo de creación del registro de perros?. Aquí estamos insertando directamente el nombre en la tabla, pero realmente queremos usar el ORM eloquent que viene con Laravel, al fin y al cabo es lo que vinimos a aprender, pues bien, en la próxima entrega veremos ésta y otras mejoras que de seguro harán nuestro trabajo más fácil, por ahora te invito a que le eches un ojo a la [documentación oficial sobre los seeders](https://laravel.com/docs/8.x/seeding). 


Quédate atento a la próxima entrega, si tienes alguna duda puedes contactarme en mi cuenta de twitter [@JohanTovar](https://twitter.com/JohanTovar) o déjala en los comentarios. Hasta entonces y que tengas un feliz y exitoso día.