Saltar a contenido

MVC y CRUD

En la UT anterior vimos lo que era el CRUD, ahora vamos a trasladarlo a nuestro framework para poder trabajar con él. El manejo de datos es una parte fundamental en cualquier aplicación, es por ello, que debemos hacerlo de una manera segura, eficaz y óptima. Por suerte, Laravel nos ayuda con todo esto.

Conectar con MySQL

Hasta ahora hemos estado trabajando con SQLite, pero para nuestros proyectos a gran escala vamos a necesitar usar un gestor más potente como es MySQL. Para ello, abre el archivo .env en el directorio raíz de tu proyecto y configura tu conexión de base de datos MySQL actualizando las siguientes líneas con la información de tu base de datos:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nombre_de_tu_base_de_datos
DB_USERNAME=usuario_de_tu_base_de_datos
DB_PASSWORD=password_de_tu_base_de_datos

Ejecuta la migración:

php artisan migrate

Si nos vamos al cliente que utilicemos para manejar la base de datos (phpMyAdmin por ejemplo) veremos que en nuestra base de datos se han creado todas las tablas de la migración que hemos ejecutado y además una tabla que se llama migrations. La tabla migrations es simplemente un registro de todas las migraciones llevadas a cabo.

Controlador tipo resource

Aunque ya hemos estudiado qué eran este tipo de controladores, su verdadera utilidad se da cuando entramos a trabajar con el CRUD. Para ello comenzaremos creando nuestro controlador:

php artisan make:controller PostController -r

Antes de seguir, ¿qué es el modelo?

En Laravel, un modelo es una clase que representa una tabla de la base de datos y proporciona una interfaz para interactuar con sus registros. Forma parte del patrón MVC (Modelo-Vista-Controlador) y su responsabilidad es gestionar la lógica relacionada con los datos.

Laravel usa un ORM llamado Eloquent, que permite trabajar con los datos mediante objetos PHP, evitando escribir consultas SQL directamente. Cada modelo se asocia automáticamente con una tabla (por convención: nombre en singular, clase en CamelCase; tabla en plural, snake_case).

Ejemplo básico de modelo:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Libro extends Model
{
    // Se relaciona automáticamente con la tabla 'libros'
}

Operaciones comunes con el modelo:

$libros = Libro::all();           // Obtener todos los libros
$libro = Libro::find(1);          // Buscar un libro por ID
Libro::create([...]);             // Crear un nuevo libro
$libro->delete();                 // Eliminar un libro

El modelo actúa como puente entre la lógica de la aplicación y la base de datos, permitiendo un código más limpio, estructurado y orientado a objetos.

Esto nos creará un controlador del tipo resource vacío. Pero podemos crear también el modelo:

php artisan make:controller PostController -r -m
PostController.php
<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(Post $post)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(Post $post)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, Post $post)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Post $post)
    {
        //
    }
}

Uso de CRUD

Para poder usar los controladores deberemos añadirlos al fichero web.php, que como vivos en el apartado de rutas:

Route::resource('post', PostController::class);

Con esto ya podemos ir trabajando en el controlador y en el modelo que hemos creado anteriormente. Ahora seguiremos un ejemplo, un post, para poder comprender cómo trabaja Laravel a la hora de interactuar con la base de datos.

Crear un registro

A la hora de crear el registro, modificaremos el modelo ya que debemos indicar los campos que se pueden rellenar, de lo contrario nos dará error. Tomaremos como ejemplo los campos típicos de un post:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'slug', 'content', 'category_id', 'description', 'posted', 'image'];
}

Ahora en nuestro controlador, en el momento que consideremos podemos crear nuestro post:

<?php

Post::create(
 [
 'title' => 'test title',
 'slug' => 'test slug',
 'content' => 'test content',
 'category_id' => 1,
 'description' => 'test description',
 'posted' => 'not',
 'image' => 'test image',
 ]
);

Esto será especialmente útil en combinación con los formularios ya que nos permitirá recoger datos e insertarlos en la base de datos.

Leer un registro

Esto se hace desde el propio objeto y los métodos que se implemente en él. Es por ello que será particular de cada uno de los desarrollos que hagamos.

Actualizar un registro

Para actualizar un objeto necesitamos tener la instancia del objeto en concreto. En este ejemplo suponemos que es el de id=1, pero cada programa se registrará de una manera diferente:

<?php
$post = Post::find(1);
$post = $post->update(
    [
    'title' => 'test title new',
    'slug' => 'test slug',
    'content' => 'test content',
    ]
); 

De este modo, se actualizan los campos que nosotros queremos que se actualicen.

Borrar un registro

Para borrar un registro debemos tener la instancia del objeto, una vez que lo tengamos, es muy parecido a la actualización.

<?php
$post = Post::find(1)->delete();

Con esto borraríamos el post de id=1.

Constructor de consultas

El constructor de consultas de base de datos de Laravel proporciona una interfaz fluida y conveniente para crear y ejecutar consultas SQL sin tener que escribir directamente las sentencias. Se puede utilizar para realizar la mayoría de las operaciones sobre una base de datos y es compatible con todos los sistemas que Laravel admite (como MySQL, PostgreSQL, SQLite o SQL Server).

El constructor de consultas de Laravel utiliza la vinculación de parámetros PDO para proteger su aplicación contra ataques de inyección SQL. No es necesario limpiar o sanitizar las cadenas pasadas al constructor de consultas como vinculaciones de consulta.

Debido a su extensión, veremos un sencillo ejemplo, pero es muy recomendable consultar la documentación para conocer todas las posibilidades que nos da.

Para comenzar a construir una consulta, se emplea el método table() del facade (o helper) DB. Este método recibe como parámetro el nombre de una tabla y devuelve una instancia del constructor de consultas asociada a dicha tabla. A partir de ese momento, se pueden encadenar distintos métodos como where(), orderBy(), limit(), etc., y finalmente ejecutar la consulta con get() para obtener los resultados.

$usuarios = DB::table('users')->get();

El método table devuelve una instancia de constructor de consultas fluido para la tabla dada, lo que le permite encadenar más restricciones a la consulta y luego finalmente recuperar los resultados de la consulta utilizando el método get:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use Illuminate\View\View;

class UserController extends Controller
{
    /**
     * Mostrar una lista de todos los usuarios de la aplicación.
     */
    public function index(): View
    {
        $users = DB::table('users')->get();

        return view('user.index', ['users' => $users]);
    }
}
El método get devuelve una instancia de Illuminate\Support\Collection que contiene los resultados de la consulta donde cada resultado es una instancia del objeto PHP stdClass. Puedes acceder al valor de cada columna accediendo a la columna como una propiedad del objeto:

<?php
use Illuminate\Support\Facades\DB;

$users = DB::table('users')->get();

foreach ($users as $user) {
    echo $user->name;
}

Actividades

  • 📝 AC 714. (RA8 / CE8c CE8d CE8f / IC1 / 3p) - Muestra un listado de todas las tareas. Para ello, introduce los datos en la base datos de manera manual.

  • ⚓ AP 715. (RA8 / CE8c CE8d CE8f / IC1 / 3p) - Tanto en el frontal como en el backend, muestra todos los post y categorías. Debes hacer uso de una base de datos MySQL.

  • 🧪 PR 716. (RA8 / CE8c CE8d CE8f / IC2 / 5p) - Es hora de conectar y listar los productos en todos los sitios posibles. El encargado de producción te ha pedido que introduzcas tú los recursos de la tienda en la base de datos y que él se encargará de revisarlos en la propia aplicación.