antes que nada:
Añadí las siguiente líneas de código en app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
antes de hacer
php artisan migrate
( para rehacer todas las tablas: php artisan migrate:fresh )
-----------------------
crear el modelo (para nuestro ejemplo se creara uno llamado "Share")
php artisan make:model Share -m
editar el archivo de migracion creado para Share
y agregarle los campos del modelo:
$table->string('share_name');
$table->integer('share_price');
$table->integer('share_qty');
ejecutar la migracion para crear la tabla:
php artisan migrate
en Share.php agregar los campos a la propiedad fillable:
protected $fillable = [ 'share_name', 'share_price', 'share_qty' ];
crear el Controlador de Share con su respectivo recurso que haga referencia a los endpoints
del crud
php artisan make:controller ShareController --resource
editar routes/web.php
y agregar este nuevo recurso:
Route::resource('shares', 'ShareController');
crear en resources/views/ una carpeta nueva llamada shares en donde residiran
las vistas de create/edit/index
los cuales deben un layout
empecemos por crear uno:
layout.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Laravel 5.7 CRUD Example Tutorial</title>
<link href="{{ asset('css/app.css') }}" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="container">
@yield('content')
</div>
<script src="{{ asset('js/app.js') }}" type="text/js"></script>
</body>
</html>
en resources/views
crear la vista para la creacion de un Share llamado
create.blade.php
la cual se llamar desde el metodo create del controlador
en ShareController.php
public function create()
{
return view('shares.create');
}
http://localhost:8000/shares/create
Para guardar los datos en ShareController.php
implementamos el metodo store
use App\Share;
public function store(Request $request)
{
$request->validate([
'share_name'=>'required',
'share_price'=> 'required|integer',
'share_qty' => 'required|integer'
]);
$share = new Share([
'share_name' => $request->get('share_name'),
'share_price'=> $request->get('share_price'),
'share_qty'=> $request->get('share_qty')
]);
$share->save();
return redirect('/shares')->with('success', 'Stock has been added');
}
el cual si es exitoso va a llamar al metodo index, por lo que vamos a implementarlo asi:
public function index()
{
$shares = Share::all();
return view('shares.index', compact('shares'));
}
y creamos la vista index.blade.php
@extends('layout')
@section('content')
<style>
.uper {
margin-top: 40px;
}
</style>
<div class="uper">
@if(session()->get('success'))
<div class="alert alert-success">
{{ session()->get('success') }}
</div><br />
@endif
<table class="table table-striped">
<thead>
<tr>
<td>ID</td>
<td>Stock Name</td>
<td>Stock Price</td>
<td>Stock Quantity</td>
<td colspan="2">Action</td>
</tr>
</thead>
<tbody>
@foreach($shares as $share)
<tr>
<td>{{$share->id}}</td>
<td>{{$share->share_name}}</td>
<td>{{$share->share_price}}</td>
<td>{{$share->share_qty}}</td>
<td><a href="{{ route('shares.edit',$share->id)}}" class="btn btn-primary">Edit</a></td>
<td>
<form action="{{ route('shares.destroy', $share->id)}}" method="post">
@csrf
@method('DELETE')
<button class="btn btn-danger" type="submit">Delete</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
<div>
@endsection
editar
ShareController.php
public function edit($id)
{
$share = Share::find($id);
return view('shares.edit', compact('share'));
}
y creamos la vista edit.blade.php
@extends('layout')
@section('content')
<style>
.uper {
margin-top: 40px;
}
</style>
<div class="card uper">
<div class="card-header">
Edit Share
</div>
<div class="card-body">
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div><br />
@endif
<form method="post" action="{{ route('shares.update', $share->id) }}">
@method('PATCH')
@csrf
<div class="form-group">
<label for="name">Share Name:</label>
<input type="text" class="form-control" name="share_name" value={{ $share->share_name }} />
</div>
<div class="form-group">
<label for="price">Share Price :</label>
<input type="text" class="form-control" name="share_price" value={{ $share->share_price }} />
</div>
<div class="form-group">
<label for="quantity">Share Quantity:</label>
<input type="text" class="form-control" name="share_qty" value={{ $share->share_qty }} />
</div>
<button type="submit" class="btn btn-primary">Update</button>
</form>
</div>
</div>
@endsection
e implementamos el metodo que actualiza el modelo editado:
public function update(Request $request, $id)
{
$request->validate([
'share_name'=>'required',
'share_price'=> 'required|integer',
'share_qty' => 'required|integer'
]);
$share = Share::find($id);
$share->share_name = $request->get('share_name');
$share->share_price = $request->get('share_price');
$share->share_qty = $request->get('share_qty');
$share->save();
return redirect('/shares')->with('success', 'Stock has been updated');
}
Borrar un registro
implementamos el metodo destroyde ShareController
public function destroy($id)
{
$share = Share::find($id);
$share->delete();
return redirect('/shares')->with('success', 'Stock has been deleted Successfully');
}