Skip to content

Capítulo 2.2: Creación del modelo Planet

Tiempo de estudio: 45 minutos


1. El modelo en Laravel: Planos de un objeto espacial

En la arquitectura MVC (Modelo-Vista-Controlador), el modelo es:

  • 📦 Contenedor de datos (parámetros de planetas)
  • 🔌 Interfaz de trabajo con la base de datos
  • 🛡️ Centro de la lógica de negocio de la aplicación

💡 Analogía espacial: El modelo Planet = Planos de un planeta en el ordenador del Centro de Control de Misión. Con él se puede:

  • Crear un nuevo planeta en el catálogo (INSERT)
  • Obtener datos sobre Marte (SELECT)
  • Actualizar información sobre la atmósfera (UPDATE)

2. Creación del modelo y la migración

Laravel utiliza Artisan CLI — su "panel de control" del proyecto.

Paso 1: Generación del modelo con migración

php artisan make:model Planet -m

Lo que se creó:

app/
  └── Models/
      └── Planet.php    ← Modelo
database/
  └── migrations/
      └── 2025_08_04_000000_create_planets_table.php  ← Migración

Banderas de Artisan:

  • -m → Crear migración
  • -c → Crear controlador
  • -r → Controlador de recursos

💡 Consejo profesional: Estas banderas se pueden combinar para una máxima eficiencia. El comando php artisan make:model Planet -mcr creará inmediatamente el modelo, la migración y el controlador de recursos para gestionar este modelo. Esto ahorra mucho tiempo.


3. Configuración del modelo Planet

Abra app/Models/Planet.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Planet extends Model
{
    // Nombre de la tabla (por defecto: 'planets')
    // Laravel asume automáticamente que el nombre de la tabla es la forma plural del nombre del modelo en snake_case (Planet -> planets).
     //Por lo tanto, esta propiedad no es obligatoria aquí, pero es útil para mayor claridad.
    protected $table = 'planets';

    // Campos permitidos para asignación masiva
    protected $fillable = [
        'name',
        'description',
        'size_km',
        'solar_system',
        'image_url'
    ];

    // Tipos de datos para conversión automática
    protected $casts = [
        'size_km' => 'integer'
    ];
}

Explicación de las propiedades:

Propiedad Valor Ejemplo de datos
$table Nombre de la tabla en la BD planets
$fillable Campos para asignación masiva name, size_km
$casts Conversión automática de tipos size_km: integer

4. Diseño de la tabla de planetas

Antes de editar la migración, definamos la estructura del "planeta":

Campo Tipo de datos Descripción Valor de ejemplo
id BIGINT (PK) ID único 1
name VARCHAR(255) Nombre del planeta "Marte"
description TEXT Descripción "Planeta rojo..."
size_km INTEGER Diámetro en km 6779
solar_system VARCHAR(100) Sistema Solar "Sistema Solar"
image_url VARCHAR(2048) URL de la foto (puede ser nulo) "https://..."
created_at TIMESTAMP Fecha de creación 2025-08-04 12:00:00
updated_at TIMESTAMP Fecha de actualización 2025-08-05 09:30:00

5. Edición de la migración

Abra el archivo de migración en database/migrations/..._create_planets_table.php:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePlanetsTable extends Migration
{
    public function up()
    {
        Schema::create('planets', function (Blueprint $table) {
            $table->id(); // BIGINT autoincremental

            $table->string('name')->unique();
            $table->text('description');
            $table->integer('size_km');
            $table->string('solar_system', 100);
            $table->string('image_url', 2048)->nullable();

            $table->timestamps(); // created_at + updated_at
        });
    }

    public function down()
    {
        Schema::dropIfExists('planets');
    }
}

Puntos clave:

  • ->unique() → Garantiza la unicidad de los nombres
  • ->nullable() → El campo puede estar vacío
  • timestamps() → Gestión automática de fechas

6. Ejecución de la migración (preliminar)

Aunque la ejecución se realizará en el capítulo 2.3, veamos cómo se verá:

php artisan migrate

Salida esperada:

Migrating: 2025_08_04_000000_create_planets_table
Migrated:  2025_08_04_000000_create_planets_table (32.15ms)

Verificación en pgAdmin 4:

  1. Abra la base de datos space_api → Schemas → Tables
  2. Debería aparecer la tabla planets con sus campos

7. Enfoque alternativo: Generadores de código

Para acelerar el desarrollo se pueden utilizar paquetes:

  • Laravel Blueprint - crea modelos/migraciones a partir de una descripción YAML
  • InfyOm Laravel Generator - generador basado en el esquema de la BD

Ejemplo de Blueprint:

models:
  Planet:
    name: string:255
    description: text
    size_km: integer
    solar_system: string:100
    image_url: string:2048? # El signo '?' indica que el campo puede ser nulo


Cuestionario para consolidación

1. Comando Artisan para crear un modelo y su migración asociada:

2. La propiedad `$fillable` en el modelo es necesaria para

3. `nullable()` en la migración significa:

4. Tipo de campo para una descripción larga del planeta:

5. El método `timestamps()` crea:


🚀 Resumen del capítulo: ¡Has creado un "gemelo digital" del planeta! Ahora tu proyecto tiene:

  • 🪐 Modelo Planet con lógica de negocio
  • 📊 Migración para la tabla planets en PostgreSQL
  • 🛠️ Propiedades del modelo configuradas (fillable, casts)

¡Prepara la base de datos! En el siguiente capítulo ejecutaremos la migración y poblaremos el universo con los primeros planetas.

📌 Comprobación:

Asegúrate de que los archivos Planet.php y ..._create_planets_table.php hayan sido creados en los directorios correctos.

⚠️ Si Artisan da errores:

  • Verifica que estés en la carpeta del proyecto
  • Asegúrate de que las dependencias estén instaladas (composer install)
  • Para Windows: añade PHP y Composer al PATH