7

Cómo hacer un CRUD en Laravel

57Puntos

hace 5 años

Curso de PHP con Laravel 2017
Curso de PHP con Laravel 2017

Curso de PHP con Laravel 2017

Construye una webapp, persiste datos en MySQL, crea notificaciones realtime, crea vistas con Blade, usa Eloquent como ORM, haz deploy a producción.

Nota de Platzi: En este tutorial, Juan Carlos Gonzales de Laravel Perú te explica paso a paso cómo hacer un CRUD, el acrónimo en inglés de Crear, Leer, Actualizar y Borrar (Create, Read, Update and Delete). Se trata de un ejemplo de formulario de registro de usuario, tal como puedes verlo en el proyecto completo en GitHub. Si quieres aprender más en detalle, toma el Curso de PHP y Laravel

1) Creando las rutas

Para empezar debes entender cómo funcionan las rutas de Laravel. Puedes observar este ejemplo de una ruta:

class="EnlighterJSRAW" data-enlighter-language="null">Route::get('user/profile', '[email protected]')->name('profile');pre>

¿Qué nos dice esta ruta? Sencillamente dice que por medio de una URI (platzi.laravel/user/profile), se conectará con el controlador (UserController). Este accederá al método showProfile, y finalmente tenemos un alias para vincular a la ruta. Es súper simple, pero no es la única forma de crear rutas, la documentación de Laravel detalla muchas maneras de usarlas. Para nuestro ejemplo de CRUD usaremos una ruta resource:

class="panel-body">
class="EnlighterJSRAW" data-enlighter-language="null">Route::resource('users', 'UserController');
Esta nos permite agrupar 7 rutas, como vemos en la imagen.
01

Si entras a tu terminal y en la ruta de tu proyecto tipeas: php artisan route:list, se te listarán todas las rutas creadas y un breve detalle.

2) Creando el controlador

Como te habrás dado cuenta, nuestra ruta apunta a un controlador llamado UserController. Sin embargo si nos vamos a la carpeta app/Http/Controllers no existe ese controlador. Utilizaremos la “magia” de Artisan para crearlo. En tu terminal escribe:

<divclass="panel panel-default">

<divclass="panel-body">

class="EnlighterJSRAW" data-enlighter-language="php">php artisan make:controller UserController --resource
div> div>

¿Qué dicen si nos fijamos ahora?

¡Así es! Como lo imaginaron, ahí está el controlador y además todos los métodos que necesitamos utilizar. Intuitivamente, cada método nos dice por su nombre qué debemos hacer. Pero si no te queda claro te lo escribo en una línea:

  • index: Lo utilizaremos para mostrar la página inicial.
  • create: Lo utilizaremos para mostrar el formulario de registro.
  • store: Este método es importante, lo usaremos para recuperar los datos escritos en el formulario y lo guardaremos en nuestra base de datos.
  • destroy: Lo utilizaremos para eliminar a un usuario.
  • edit: Con este método mostraremos el formulario de edición.
  • update: Con este método editaremos el registro.
02

namespace: Nos permite definir la ubicación donde se encuentra la clase. use: Nos permite llamar a otras clases para poder utilizarlas, estas clases están registradas como alias en: app/config/app.php, Laravel nos brinda múltiples clases para manejar (Session, mail, request, auth, events, files, etc…). extends: Es una palabra reservada para extender a una clase padre. El famoso concepto de herencia de POO. En el caso de los controladores, estos extienden a una clase padre llamada Controller.php.

3) Listar usuarios

El primer reto será listar los usuarios de una tabla llamada user. Aquí haremos un paréntesis de configuración:

Ponemos dentro de **.env**
DB_DATABASE=nameBD
DB_USERNAME=root
DB_PASSWORD=passwordBD
Con esto nos estaremos conectando a nuestra base de datos.
Laravel por defecto trae dos tablas, **_users_**y _**migration**_, que se ubican en_**database/migrations**_.
php artisan migrate
Con esto estamos ejecutando los archivos de migración para transformarlos en tablas.

Retomemos el listar…

Para listar a los usuarios, tenemos que llamar al modelo desde nuestro controlador, y luego utilizar un poco de la magia de eloquent.Modelo: será la representación de nuestra tabla, Laravel nos permite manejar la tabla como un objeto. Agrega el modelo (User.php) a nuestro controlador (UserController.php):

<divclass="panel panel-default">

<divclass="panel-body">

class="EnlighterJSRAW" data-enlighter-language="null">use App\User;
div> div>

En el método “index”, de UserController, escribimos lo siguiente:

"EnlighterJSRAW" data-enlighter-language="null">//Traemos todos los registros de los usuarios.

$data = User::all();
//Enviamos esos registros a la vista.

return view($this->path.'.index', compact('data'));

Quizás te preguntes, y ese $this->path, ¿qué es y dónde está? Es simple, lo tienes que agregar como una propiedad y asignarle un valor inicial que nos diga cuál es la carpeta donde colocaremos las vistas para este módulo de usuarios. De esta manera si en algún momento movemos de carpeta a nuestras vistas para user o renombramos la carpeta solo tendríamos que cambiar la propiedad path.

Algo que no puedo olvidar de mencionar: User::all() trae todos los usuarios de la tabla users, ¿pero cómo lo hace? Abre app/User.php y verás que esa clase se conecta con la tabla users y utilizando el ORM de ELOQUENT agregando ::all() le estamos diciendo que traiga todos los registros, olvídate del select * from users:  ELOQUENT lo hace por ti.

03

Listar usuarios en mi HTML

En el paso anterior mandamos a todos los usuarios a la vista, pero ahora nos falta manipular esta información en la vista y mostrarlas. ¡Veremos trabajar a Blade! Desde nuestro controlador, enviamos una variable llamada data a la vista index.blade.php. Tenemos que recoger esa variable y decirle lo siguiente:

  • Si la variable $data tiene contenido pinta la tabla.
  • Una vez dentro de la condición, hacemos un recorrido @foreach
  • Este recorrido comenzará a mostrar fila x fila los usuarios registrados de la tabla.
04

Una vez realizado estos pasos, puedes abrir tu proyecto en el explorador; en mi caso configuré un dominio local:

class="panel panel-default">
class="panel-body">
class="EnlighterJSRAW" data-enlighter-language="null">http://platzi.laravel/users
Por ahora debería salir en blanco ya que no tenemos registros...

4) Registrando usuarios

Para registrar a los usuarios dividiremos la explicación en dos, la primera parte de como mostrar un formulario en una vista, y la segunda parte de como guardar los datos escritos desde el formulario en la tabla users. Ahora usaremos dos métodos, empezamos por el método create, donde escribiremos lo siguiente:

class="panel panel-default">
class="panel-body">
class="EnlighterJSRAW" data-enlighter-language="null">returnview($this->path.'.create');
Como quizás hayas adivinado, esta vista **(create.blade.php)** no existe, y si te has dado cuenta también debe estar enla carpeta de **resources/views/users**.

05 Te muestro mi código HTML, estoy poniendo tres cosas importantes:

class="panel panel-default">
class="panel-body">Vínculo para ir a la lista de usuarios creada en el paso (3)
class="EnlighterJSRAW" data-enlighter-language="null">href="{{ route('users.index') }}">Listar usuarios
La acción es _post_, y se redirigirá a la ruta _users_. Ojo, no es la misma ruta, está usando un verbo diferente.
class="EnlighterJSRAW" data-enlighter-language="null">form method="post" action="/users">
Laravel nos deja prolijo el formulario contra ataques, añadiendo un token por cada envío de formulario. Este token tiene una duración temporal quete da la confianza necesaria para implementar envío de datos por formularios.
class="EnlighterJSRAW" data-enlighter-language="null">inputtype="hidden" name="_token" value="{{ csrf_token() }}">

Registrando en la tabla:users

Tenemos que recoger los valores del formulario e ingresarlos a la tabla users. Como verás en el método store, uso un try - catch para controlar la acción del guardar. Esto no es del todo necesario, pero siempre es importante controlar los errores por si algo llega a romperse. En la parte superior he agregado use Exception; Si todo registró correctamente lo redirecciono a la lista de usuarios. 06 Una vez registrado el usuario deberían aparecer de la siguiente manera los registros hechos: 07 Recordemos como está nuestra vista de listar (index.blade.php): 08

5) Actualizar usuario

La lógica de edición es simple, necesitamos decirle a quién queremos editar, y qué es lo que estamos editando. En nuestra tabla debemos buscar ese registro y cambiar la información por la nueva data.

"panel panel-default">
"panel-body">Con **findOrFail** buscamos por su llave primaria **id** la coincidencia de **$id**. Si no lo encuentra votará un error.
"EnlighterJSRAW" data-enlighter-language="null">$user = User::findOrFail($id);
Ese resultado lo guardamos en la variable **$user** y se lo mandamos a la vista para poder rellenar el formulario.
"EnlighterJSRAW" data-enlighter-language="null">return view($this->path.'.edit', compact('user'));
De esta manera quedaría nuestro HTML, un formulario donde colocamos dentro de cada input el valor del registro, utilizando el objeto enviado desde el controlador.

09 Fíjate que en el formulario enviamos un input oculto donde le indicamos que el verbo es PUT. 12 Ahora necesitamos actualizar la tabla si cambiamos de contenido. Para ello recuperaremos todos los inputs, dentro del método update. Recuperando el registro que coincida con el id empezaremos a llenar cada columna con cada valor. Finalmente utilizamos el alias retornar a la lista de usuarios. 10

6) Eliminar usuario

Para eliminar es súper sencillo, Laravel nos hace la vida facil. La lógica es decirle a Laravel a quién queremos eliminar y listo, registro eliminado.

La vista de listar (index.blade.php) tiene un botón de eliminar que trae a este método el $id del usuario*, con esto podemos encontrar al usuario y pasarle la acción eliminar. 11 Como ves arriba, uso un try - catch, nuevamente… Para terminar de entender este tema te recomiendo aprender más sobre exceptions.

Hablando de eso, Errores y excepciones son unos de los conceptos esenciales que puedes estudiar con el curso de Laravel y PHP en Platzi.

Curso de PHP con Laravel 2017
Curso de PHP con Laravel 2017

Curso de PHP con Laravel 2017

Construye una webapp, persiste datos en MySQL, crea notificaciones realtime, crea vistas con Blade, usa Eloquent como ORM, haz deploy a producción.
Juan Carlos
Juan Carlos
juangonzaq

57Puntos

hace 5 años

Todas sus entradas
Escribe tu comentario
+ 2
Ordenar por:
1
13740Puntos

En la actualización de los datos del usuario. El input password es omitido, es decir tiene otro formulario aparte no? ¿Comó debe de ser el formulario y sus respectivos MVC para actualizar o cambiar una contraseña de usuario?

1
781Puntos

Como que no esta bien configurado el plugin para mostrar codigo, igual el html se anda mostrando.

0
63Puntos
4 años

todo el artículo se lee con dificultad por este error

1
4424Puntos

Muchas gracias por tu aporte ha sido de mucha ayuda, el texto es un poco confuso por el tema de que se pinta la sintaxis HTML de resto todo super funciona a la perfeccion.

1
881Puntos

Como puedo insertar datos en dos tablas diferentes? tengo una tabla producto y otra imagen … pero dedo guardar datos en las dos tabla en el mismo formulario … como tengo en enviar en el controlador y en la vista …??? ayuda!!

0
1033Puntos

Muchas gracias =).

0
13740Puntos

No me queda claro lo de la vista del botón para borrar. En el paso “6) Eliminar usuario”. ¿Exactamente como debe de ser el código del botón?

1
4424Puntos
3 años

Debes agregar el boton “Eliminar” en la vista index, dentro de tu @foreach con un nuevo <td> creando un formulario asi:

<td><formaction="{{route('empresas.destroy', $empresa->id)}}"method="post"><inputname="_method"type="hidden"value="Delete"><inputtype="hidden"name="_token"value="{{ csrf_token() }}"><buttontype="submit"class="btn btn-danger">Eliminar</button>
            |                                   </form></td>```

Despues de esto debes crear la funcion destroy(){} en el controller asi: 


public function destroy($id) {
try{
$empresa = Empresa::findOrFail($id);
$empresa->delete();
return redirect()->route(‘empresas.index’);
} catch (Exception $e) {
return 'fatal error - '.$e->getMessage();
}
}```

El ejemplo de codigo que te puse es por que lo use en una aplicacion propia asi que se cuidadoso en cambiar los nombre de las vistas correctas.