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>