MVC Master

Módulo 6: CRUD Cursos (Con Inner Join N:1)

Para tu plataforma VIP, creamos un Modelo que no sólo inserta, sino que realiza un INNER JOIN para buscar el Nombre del Profesor, y enseñamos el formulario de alta en su propia vista separada brillante.

6.1: Modelo Cursos (Cruce Relacional)

app/Models/CursoModelo.php
<?php
namespace App\Models;

class CursoModelo extends \App\Core\ModeloBase {
    protected $tabla = 'cursos'; 
    
    public function insertar($nombre, $id_profesor_db) {
        $sql = "INSERT INTO {$this->tabla} (nombre, id_profesor) VALUES (:n, :p)";
        return $this->db->prepare($sql)->execute(['n'=>$nombre, 'p'=>$id_profesor_db]);
    }
    
    public function allConProfe() {
        $sql = "SELECT c.id, c.nombre, p.nombre as profesor 
                FROM cursos c JOIN profesores p ON c.id_profesor = p.id";
        return $this->db->query($sql)->fetchAll(\PDO::FETCH_OBJ);
    }
}

6.2: Controlador de Asignaturas

app/Controllers/DemoController.php
    public function cursos() {
        $this->render('cursos/index', [
            'titulo' => 'Inventario', 
            'listacursos' => (new \App\Models\CursoModelo())->allConProfe()
        ]);
    }
    public function crearCurso() {
        $this->render('cursos/crear', ['listaprofes' => (new \App\Models\ProfesorModelo())->all()]);
    }
    public function guardarCurso() {
        (new \App\Models\CursoModelo())->insertar($_POST['nombre'], $_POST['id_profe']);
        header("Location: " . BASE_URL . "/demo/cursos"); exit;
    }

6.3: Vista Index y Vista Crear (Mismo estilo que Estudiantes)

Primero crea tu listado con la tabla cruzada.

app/Views/cursos/index.php
<div class="card border-0 shadow-sm p-4" style="border-radius: 15px;">
    <div class="d-flex justify-content-between mb-4">
        <h2 class="fw-bold">Directorio Asignaturas</h2>
        <a href="/demo/cursos/crear" class="btn btn-warning">Aperturar Curso</a>
    </div>

    <table class="table table-hover bg-white">
        <thead class="table-light">
            <tr><th>ASIGNATURA</th><th>DOCENTE (Inner Join)</th></tr>
        </thead>
        <tbody>
            <?php foreach($listacursos as $curso): ?>
            <tr>
                <td class="fw-bold"><?= $curso->nombre ?></td>
                <td><?= $curso->profesor ?></td>
            </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
</div>

Y ahora la gema, el formulario "crear.php" que invoca la Llave Foránea (El Docente) a través de un combobox `<select>` conectado por PDO.

app/Views/cursos/crear.php
<div class="container d-flex justify-content-center mt-4">
    <div class="card shadow-sm border-0 p-5 bg-white w-50" style="border-radius:15px;">
        <form action="/demo/cursos/guardar" method="POST">
            <label>Título del Curso</label>
            <input type="text" name="nombre" class="form-control mb-4" required>
            
            <label class="text-danger fw-bold">Asignar a Profesor (FK)</label>
            <select name="id_profe" class="form-select border-danger mb-4" required>
                <?php foreach($listaprofes as $p): ?>
                    <option value="<?= $p->id ?>"><?= $p->nombre ?> (<?= $p->especialidad ?>)</option>
                <?php endforeach; ?>
            </select>

            <button class="btn btn-warning w-100 fw-bold">GUARDAR EN BD</button>
        </form>
    </div>
</div>