Tutorial 4: Migrar Tablas y Crear Primer Usuario

4: Migrar Tablas y Crear Primer Usuario

1. Introducción

En este tutorial modificaremos la tabla de usuarios para adaptarla a nuestro sistema de citas médicas, ejecutaremos las migraciones de Laravel e instalaremos el sistema de autenticación para poder crear nuestro primer usuario. Este será el paso inicial para comenzar a trabajar con los diferentes roles en nuestra aplicación.


2. Migraciones por Defecto en Laravel

Cuando instalamos Laravel, ya vienen incluidas algunas migraciones predeterminadas:

MigraciónDescripción
create_users_tableTabla de usuarios (la más importante)
create_password_resets_tableTabla para restablecer contraseñas
create_failed_jobs_tableTabla para trabajos fallidos

La tabla users es la que modificaremos para adaptarla a nuestro sistema.


3. Modificar la Tabla de Usuarios

Paso 1: Localizar el archivo de migración

Ve a la carpeta database/migrations/ y busca el archivo que contiene create_users_table. Su nombre será similar a:

text
database/migrations/2024_01_01_000000_create_users_table.php

Paso 2: Modificar el esquema de la tabla

Abriremos el archivo y agregaremos nuevos campos a la tabla users. En el método up(), dentro del Schema::create, agregamos:

php
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        // Campos existentes
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        
        // ════════════════════════════════════════════════════════
        // NUEVOS CAMPOS PARA NUESTRO SISTEMA DE CITAS MÉDICAS
        // ════════════════════════════════════════════════════════
        
        $table->string('documento', 20)->nullable();      // Número de identificación
        $table->string('telefono', 20)->nullable();        // Teléfono de contacto
        $table->string('sexo', 10)->nullable();            // Sexo del usuario
        $table->integer('consultorio')->nullable();        // ID del consultorio (para doctores)
        $table->string('rol', 20)->default('paciente');    // Rol: admin, secretaria, doctor, paciente
        
        $table->timestamps();
    });
}

4. Ejecutar las Migraciones

Paso 1: Abrir la terminal

Abre el símbolo del sistema o terminal y navega a la carpeta de tu proyecto:

bash
cd C:\xampp\htdocs\clinica-l8

Paso 2: Ejecutar el comando de migración

bash
php artisan migrate

Resultado esperado

Verás un mensaje similar a:

text
Migration table created successfully.
Migrating: 2024_01_01_000000_create_users_table
Migrated:  2024_01_01_000000_create_users_table (0.05 seconds)
Migrating: 2024_01_01_000001_create_password_resets_table
Migrated:  2024_01_01_000001_create_password_resets_table (0.03 seconds)
Migrating: 2024_01_01_000002_create_failed_jobs_table
Migrated:  2024_01_01_000002_create_failed_jobs_table (0.02 seconds)

Paso 3: Verificar en la base de datos

Ve a phpMyAdmin (http://localhost/phpmyadmin) y revisa tu base de datos clinica_l8. Deberías ver:

text
┌─────────────────────────────┐
│   TABLAS CREADAS            │
├─────────────────────────────┤
│  ✓ users                    │
│  ✓ password_resets          │
│  ✓ failed_jobs              │
│  ✓ migrations               │
└─────────────────────────────┘

Si abres la tabla users, verás que los nuevos campos están creados.


5. Instalar el Sistema de Autenticación

Para poder registrar usuarios fácilmente, instalaremos el paquete de autenticación de Laravel.

Paso 1: Instalar laravel/ui

En la terminal, ejecuta:

bash
composer require laravel/ui

Espera a que se complete la descarga.

Paso 2: Generar los archivos de autenticación

bash
php artisan ui bootstrap --auth

Paso 3: Compilar los assets (opcional)

Si tienes Node.js instalado, puedes compilar los assets:

bash
npm install && npm run dev

6. Modificar el Modelo User

Para que Laravel pueda insertar los nuevos campos, debemos actualizar el modelo User.

Abrir el archivo app/Models/User.php

Agrega los nuevos campos a la propiedad $fillable:

php
<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
        'documento',     // ← NUEVO
        'telefono',      // ← NUEVO
        'sexo',          // ← NUEVO
        'consultorio',   // ← NUEVO
        'rol',           // ← NUEVO
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

7. Modificar el Controlador de Registro

Ahora actualizaremos el controlador de registro para que maneje los nuevos campos.

Abrir el archivo app/Http/Controllers/Auth/RegisterController.php

Busca el método create() y agrega los nuevos campos:

php
protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        'documento' => $data['documento'] ?? null,      // ← NUEVO
        'telefono' => $data['telefono'] ?? null,        // ← NUEVO
        'sexo' => $data['sexo'] ?? null,                // ← NUEVO
        'consultorio' => $data['consultorio'] ?? 0,     // ← NUEVO
        'rol' => $data['rol'] ?? 'paciente',            // ← NUEVO
    ]);
}

8. Modificar la Vista de Registro

Para poder ingresar los nuevos campos, debemos agregarlos al formulario de registro.

Abrir el archivo resources/views/auth/register.blade.php

Agrega los nuevos campos entre el formulario:

html
<!-- Nombre -->
<div class="form-group row">
    <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
    <div class="col-md-6">
        <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
        @error('name')
            <span class="invalid-feedback" role="alert">
                <strong>{{ $message }}</strong>
            </span>
        @enderror
    </div>
</div>

<!-- Email -->
<div class="form-group row">
    <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
    <div class="col-md-6">
        <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
        @error('email')
            <span class="invalid-feedback" role="alert">
                <strong>{{ $message }}</strong>
            </span>
        @enderror
    </div>
</div>

<!-- ════════════════════════════════════════════════════════ -->
<!-- NUEVOS CAMPOS PARA EL SISTEMA DE CITAS MÉDICAS          -->
<!-- ════════════════════════════════════════════════════════ -->

<!-- Documento -->
<div class="form-group row">
    <label for="documento" class="col-md-4 col-form-label text-md-right">{{ __('Documento') }}</label>
    <div class="col-md-6">
        <input id="documento" type="text" class="form-control" name="documento" value="{{ old('documento') }}">
    </div>
</div>

<!-- Teléfono -->
<div class="form-group row">
    <label for="telefono" class="col-md-4 col-form-label text-md-right">{{ __('Teléfono') }}</label>
    <div class="col-md-6">
        <input id="telefono" type="text" class="form-control" name="telefono" value="{{ old('telefono') }}">
    </div>
</div>

<!-- Sexo -->
<div class="form-group row">
    <label for="sexo" class="col-md-4 col-form-label text-md-right">{{ __('Sexo') }}</label>
    <div class="col-md-6">
        <select id="sexo" class="form-control" name="sexo">
            <option value="">Seleccionar</option>
            <option value="Masculino">Masculino</option>
            <option value="Femenino">Femenino</option>
        </select>
    </div>
</div>

<!-- Rol (Oculto para este registro) -->
<!-- Como solo registraremos un usuario por ahora, ocultamos el rol -->

<!-- Contraseña -->
<div class="form-group row">
    <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
    <div class="col-md-6">
        <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
        @error('password')
            <span class="invalid-feedback" role="alert">
                <strong>{{ $message }}</strong>
            </span>
        @enderror
    </div>
</div>

<!-- Confirmar Contraseña -->
<div class="form-group row">
    <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
    <div class="col-md-6">
        <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
    </div>
</div>

9. Crear el Primer Usuario

Ahora que todo está configurado, crearemos nuestro primer usuario.

Paso 1: Acceder al formulario de registro

Abre tu navegador y ve a:

text
http://127.0.0.1:8000/register

Paso 2: Completar el formulario

Ingresa los siguientes datos:

CampoValor
NameMaría Gaspard
E-Mailmaria@example.com
Documento12345678
Teléfono555-1234
SexoFemenino
Password123 (por ahora)
Confirm Password123

Paso 3: Registrar

Haz clic en "Register".

Paso 4: Verificar en la base de datos

Ve a phpMyAdmin y revisa la tabla users:

sql
SELECT * FROM users;

Deberías ver tu primer usuario registrado con el rol paciente por defecto.


10. Modificar el Rol del Usuario (Manual)

Como queremos que el primer usuario sea Administrador, lo modificamos manualmente.

Opción 1: Desde phpMyAdmin

  1. Ve a la tabla users

  2. Busca el usuario creado

  3. Edita el campo rol y cámbialo a admin

  4. Guarda los cambios

Opción 2: Desde Tinker (Línea de comandos)

bash
php artisan tinker

Luego ejecuta:

php
$user = User::find(1);
$user->rol = 'admin';
$user->save();

11. Verificación Final

Paso 1: Cerrar sesión

Si estás autenticado, cierra sesión desde la opción "Logout" en la esquina superior derecha.

Paso 2: Iniciar sesión

Ve a:

text
http://127.0.0.1:8000/login

Ingresa:

  • Email: maria@example.com

  • Password: 123

Paso 3: Verificar

Una vez autenticado, deberías ver el dashboard de Laravel. ¡Tu usuario administrador está listo!


12. Resumen de Comandos

bash
# Ver las migraciones disponibles
php artisan migrate:status

# Ejecutar todas las migraciones
php artisan migrate

# Crear una nueva migración
php artisan make:migration add_fields_to_users_table

# Instalar autenticación
composer require laravel/ui
php artisan ui bootstrap --auth
npm install && npm run dev

# Abrir consola interactiva
php artisan tinker

13. Solución de Problemas

ProblemaSolución
Class not foundEjecuta composer dump-autoload
Migration already existsEjecuta php artisan migrate:fresh (borra y recrea)
SQLSTATE[HY000] [1049]Revisa el nombre de la base de datos en .env
Field not foundRevisa que los campos estén en $fillable del modelo
El registro no muestra nuevos camposRevisa el archivo register.blade.php

14. Conclusión

🎉 ¡Excelente! Hemos:

  1. ✅ Modificado la tabla de usuarios con nuevos campos

  2. ✅ Ejecutado las migraciones correctamente

  3. ✅ Instalado el sistema de autenticación

  4. ✅ Actualizado el modelo y controlador de registro

  5. ✅ Creado nuestro primer usuario Administrador

En el próximo tutorial implementaremos la plantilla AdminLTE para darle un diseño profesional a nuestro sistema de citas médicas

Comentarios