Skip to content

3 - Migraciones y Modelos

Introducción

Enlace tutorial: 3 Migraciones Modelos

Recuerda: Cuando comentemos algún archivo, siempre es bueno indicar la ruta

✅ Marcas De Tiempo

0:00:00 - Introducción 0:00:55 - Configuración De La Capa De Persistencia 0:23:37 - Migraciones 0:45:17 - Rollbacking 1:03:09 - Modelos 1:24:29 - Conclusiones

Introducción

El video trata sobre Curso Profesional De LARAVEL: Episodio 3 - Migraciones Y Modelos pero también intenta abordar el siguiente tema:

Uso de Migraciones Modelos en Detalle Herramientas LARAVEL.

1736527382140

Configuración De La Capa De Persistencia

0:00:55 - Creamos un nuevo proyecto llamado modeldata, vamos a centrarnos en el modelo y en la base de datos

Si creamos el proyecto con laravel new, que nos pide más opciones, lo creamos sin starter kit (none)

laravel new modeldata

INFO Application key set successfully.

Corremos las migraciones iniciales y luego vemos para qué sirven.

Would you like to run the default database migrations? (yes/no) [yes]: NO

El sistema de persistencia debe ser gestionado por Laravel a través del motor ORM

Necesitamos especificar en el .env a qué sistema vamos a conectar, en el tutorial lo hace con Mysql y nosotros con SQLite, todo esto se puede ver con mayor profundidad en /Config/database.php aunque a menos que queramos cambiar algo

1736528561761

Si necesitamos otro sistema, necesitaríamos añadir el driver a este fichero de configuración.

Migrate

Comando para migrar todas nuestras migraciones

php artisan migrate

1736528812531

Con lo que se crean todas las tablas que le hemos indicado, que son las que vienen por defecto.

1736528878082

Y que si pulsamos ahora sobre database.sqlite, las veremos, 10 tablas:

1736528917141

Si vuelvo a ejecutar el comando migrate, Laravel ya sabe que no tiene nada que migrar:

INFO Nothing to migrate.

Hasta aquí, ya hemos configurado la estructura de nuestras tablas y la configuración a la base de datos.

Migraciones

0:23:37 -

Ahora vamos a crear nosotros un fichero para crear la estructura de nuestro objeto. Necesitaremos un archivo de migración para que nos cree la tabla necesaria.

1736530398856

php artisan make:migration nombre_migracion_table

El comando para crear migraciones se ejecuta con make, un comando que usaremos mucoh de aquí en adelante.

php artisan make:migration create_notes_table

Y si todo ha ido bien: INFO Migration [C:\xampp\htdocs\...modeldata\database\migrations/2025_01_10_173622_create_notes_table.php] created successfully.

Con lo que crea el fichero para crear la tabla notes

1736530633764

1736530712190

El archivo genera una clase que extiende de la clase Migration con dos métodos

  • up: Info para crear la tabla
  • down: info para borrar esa migración y hacer rollback

Clase schema

La clase schema puede crear todos los elementos de la tabla.

  • create
  • table
  • dropIfExists
  • 1736530850202

nomenclatura de las tablas

Es IMPORTANTE que para que funcione bien automatizado las tablas se escriban en plural y todo en minúscula:

Así, la función create recibe dos argumentos: notes y function

Blueprint es una clase que contiene todos los métoodos para generar la estructura de la tabla

  • Por defecto nos añade dos campos: id y timestamps.

Vamos a agregar algunos campos para nuestras notas:

1736531450131

Además, a cada una de los campos que hemos creado, podemos añadirle más condiciones, y esto se hace de la siguiente forma encadenando métodos.

Por ejemplo que pueda ser nulo (ya que por defecto son requeridos)

$table->string('description',255)->nullable();//text
$table->boolean('done')->default(false);//tinyint(1)

Como hemos creado una migración que hemos hecho anteriormente, tenemos que volver a migrarla para que se migre a la base de datos.

php artisan migrate

   INFO  Running migrations.

  2025_01_10_173622_create_notes_table ............................................................................... 68.16ms DONE

Y si vemos, podemos encontrar la nueva tabla notes y en la tabla migrations vemos que hay un nuevo lote:

1736531789490 1736531842865

Rollbacking

0:45:17 -

Imaginemos que nos damos cuenta que algún campo se nos ha olvidado o debemos cambiar.

1- Lo que NO se debe hacer:

Tocar las tablas directamente en la base de datos. No demos manipular el sistema de datos.

2- Rollback

Es la que usaremos la mayoría de veces, más directa, haciendo rollback.

  • Si vemos la tabla migrations de nuestra base de datos, vemos el lote 2 con la última migración
  • Si lo quiero tirar para atrás
  • php artisan migrate:rollback
  • INFO Rolling back migrations.
  • 2025_01_10_173622_create_notes_table ...................................................... 5.06ms DONE
  • 1736534003268
  • El lote 2 ha desaparecido y la tabla notes ha dejado de existir, ahora puedo hacer lo que quiera,
  • añado campo deadline y hago php artisan migrate
  • 1736534128427
  • Hemos realizado una manipulación correcta del proceso de migración
  • Ha usado la función down al hacer el rollback.

Otros tipos de rollback, hay muchos pero los más comunes son:

  1. php artisan migrate:reset para borrar todas las migraciones
  2. php artisan migrate:rollback --batch=1
  3. php artisan migrate:refresh para borrar las migraciones y volver a migrar

3- Update table

Algunas veces, cuando si hacemos rollback perdemos mucho de lo realizado como claves, relaciones, etc.

Estas modificaciones nos interesará generar nuevo archivo de migración para ACTUALIZAR la estructura de una tabla y NO para crearla

  • php artisan make:migration update_notes_table

Y genera un nuevo archivo de migración:

1736534528772

Ahora, en nuestro schema, en vez de create vamos a usar la función table (para modificar la tabla ya creada)

Tenemos que tener en cuenta que en el down ya no vamos a tirar la tabla entera si no que debemos realizar lo contrario que en el up

El archivo update_notes_table queda:

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('notes', function (Blueprint $table) {
            $table->string('author');// tras la  migracion se añade la columna author
            //tambien se puede eliminar una columna:
            $table->dropColumn(['deadline']); //arrau con las columnas a eliminar
        }); 
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('notes', function (Blueprint $table) {
            $table->dropColumn(['author']);
            //$table->date('deadline'); // no es necesario ya que en el down de la primera migracion se elimina la tabla
        }); 
    }
};

En el video ELIMINA este archivo y no lo ejecuta, pero si queremos ejecutar la migración vemos como cambia estas columnas:

1736535028251

Tras comprobar, borro el archivo migrate y hago refresh.

PASOS para crear la migración vistos

  1. Paso 1. copia y pega .env y configura la base de datos, nuestro caso más fácil con sqlite
  2. Paso 2. Ejecuta el comando php artisan migrate (estructura en tu sistema)

Hasta ahora, hemos hecho la base de datos, pero vamos a trabajar a través de modelos y vamos a ver cómo se vinculan en la bbdd.

Modelos

1:03:09 -

Con el framework no nos preocupamos cómo y cuándo se guarda en la base de datos, trabajamos con clases y objetos a traves de modelos y de la persistencia de la base de datos se encarga el ORM Eloquent.

1736571010348

Generamos Modelos y aprendemos su vinculación con el sistema de persistencia.

Vamos a crear el modelo Note (IMPORTANTE convención los modelos en singular, en INGLÉS y con UpperCamelCase/PascalCase)

¿Cómo genero el modelo?

php artisan make:model Note

  • INFO Model [C:\xampp\htdocs\dwes\...\modeldata\app\Models\Note.php] created successfully.
  • 1736571694409
  • ¿Qué es un modelo? Es una clase que extiende de la clase Model en POO, la que nos incluirá todas las acciones que necesitemos.
  • En Laravel 11, vemos como NO incluye la factory por defecto, lo veremos.

Flujo del modelo y convención nombre tabla:

En este punto, el modelo, si lo hemos escrito bien en inglés y en singular ya sabe que se apoyará en la micración create_notes_table para las operaciones de creación.

¿Pero si no respeto la convención de nombres?¿Cómo mapeo? imaginate que en tu empresa las tablas estan en español,

le indico en la tabla model: dentro del modelo así

class Note extends Model
{
    //¿Pero si no respeto la convención de nombres?¿Cómo mapeo? imaginate que en tu empresa las tablas estan en español, 
    //le indico en la tabla model: dentro del modelo así
    protected $table = 'notas';
}

Ahora mismo nos falta la parte de CONTROLLERs para que todo funcione a la perfección.

Hasta ahora, la clase Note es un modelo que trabaja con la tabla notes y trabajaremos con programación OO.

Fillable, Guard, Cast y Hidden

Vamos a aprender estos primeros valores del modelo.

Con table hacemos la vinculación al sistema de persistencia, que está hecho por defecto salvo que no se respete nombre.

  • fillable, campos que podrán cumplimentarse
  • Hay campos que no queremos permitir que se cumplimenten, por ejemplo el ID

1736572490834

  • guard, al contrario que fillable, son los datos que NO van a poder ser cumplimentados
  • No es necesario definirlos ambos, son contrapuestos
  • Si defino fillable, guard son el resto
  • Si defino guard, fillable va a ser el resto de campos
  • cast, para forzar que en el deadline sea una fecha, por ejemplo.
  • hidden, para evitar enviar datos para serializar, por ejemplo hacemos api y en el modelo user no queremos enviar el password, aunque esté encriptado, ya que no es seguro.

Así, hemos dejado nuestro modelo:

class Note extends Model
{
    //¿Pero si no respeto la convención de nombres?¿Cómo mapeo? imaginate que en tu empresa las tablas estan en español, 
    //le indico en la tabla model: dentro del modelo así
    //protected $table = 'notas';

    pr

Atajos en la creación

Si pensamos, hemos hecho la migración y después el modelo.

Ahora, vamos a hacerlo de una tacada, creando el modelo y su migración, creamos un ejemplo Author_ y observamos como crea el modelo y su migración, con lo que evitamos errores en la nomenclatura de la tabla y archivos.

php artisan make:model Author --migration

 INFO  Model [C:\xampp\htdocs\dwes\...modeldata\app\Models\Author.php] created successfully.

   INFO  Migration [C:\xampp\htdocs\dwes\...modeldata\database\migrations/2025_01_11_052813_create_authors_table.php] created successfully.

Modelo Author: 1736573366149 Migración: 1736573372871

En la documentación de Laravel vienen todas las opciones:

If you would like to generate a database migration when you generate the model, you may use the --migration or -m option:

php artisan make:model Flight --migration

You may generate various other types of classes when generating a model, such as factories, seeders, policies, controllers, and form requests. In addition, these options may be combined to create multiple classes at once:

# Generate a model and a FlightFactory class...
php artisan make:model Flight --factory
php artisan make:model Flight -f

# Generate a model and a FlightSeeder class...
php artisan make:model Flight --seed
php artisan make:model Flight -s

# Generate a model and a FlightController class...
php artisan make:model Flight --controller
php artisan make:model Flight -c

# Generate a model, FlightController resource class, and form request classes...
php artisan make:model Flight --controller --resource --requests
php artisan make:model Flight -crR

# Generate a model and a FlightPolicy class...
php artisan make:model Flight --policy

# Generate a model and a migration, factory, seeder, and controller...
php artisan make:model Flight -mfsc

# Shortcut to generate a model, migration, factory, seeder, policy, controller, and form requests...
php artisan make:model Flight --all
php artisan make:model Flight -a

# Generate a pivot model...
php artisan make:model Member --pivot
php artisan make:model Member -p

Conclusiones

1:24:29 -

En el tutorial anterior vimos vistas estáticas

En este hemos creado migraciones y modelos, nos falta ver el controlador para unir las dos anteriores.

rutas

Recuerda: Cuando comentemos algún archivo, siempre es bueno indicar la ruta

Referencias: