Curso App para Pizzería con delivery
Implementación del CRUD Productos Laravel 9
Modelo, Migración, relación con categorías, métodos para el controlador, vistas y rutas para gestionar los datos de la tabla productos.
Modelo, Migración, relación con categorías, métodos para el controlador, vistas y rutas para gestionar los datos de la tabla productos.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Producto extends Model
{
use HasFactory;
protected $fillable = [
'slug',
'nombre',
'descripcion',
'urlfoto',
'precio',
'stock',
'presentacion',
'publicado', //boolean
'orden',
'visitas',
'portada', // boolean
'categoria_id'
];
public function categoria(){
return $this->belongsTo(Categoria::class);
}
public function precios(){
return $this->hasMany(Precio::class);
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('productos', function (Blueprint $table) {
$table->id();
$table->string('slug',50)->nullable();
$table->string('nombre',50)->nullable();
$table->text('descripcion')->nullable();
$table->string('urlfoto',60)->nullable();
$table->decimal('precio',7,2)->nullable();
$table->integer('stock')->default(0.0);
$table->boolean('publicado')->default(0);
$table->integer('orden')->default(0);
$table->integer('visitas')->default(0);
$table->boolean('portada')->default(0);
$table->foreignId('categoria_id')->references('id')->on('categorias');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('productos');
}
};
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Producto;
use App\Models\Categoria;
use Illuminate\Support\Str;
use Session;
class ProductoController extends Controller
{
public function index(){
if(Session::get("categoria_id")!=null){
$productos = Producto::whereCategoria_id(Session::get("categoria_id"))->get(["id","nombre","urlfoto","precio"]);
$categoria = Categoria::find(Session::get("categoria_id"));
return view("admin.producto.index",compact("productos","categoria"));
}
}
public function create(){
$categorias = Categoria::orderBy('nombre','ASC')->pluck('nombre','id');
return view('admin.producto.create',compact("categorias"));
}
public function store(Request $request){
$producto = new Producto($request->all());
// tratamiento de imagenes
if ($request->hasFile('urlfoto')){
$file = $request->file('urlfoto');
$nombre = $file->getClientOriginalName();
$file->move(public_path('/img/'),$nombre);
$producto->urlfoto = $nombre;
}
// fin tratamiento de imagenes
$producto->publicado= $request->publicado ? 1 : 0;
$producto->portada = $request->portada ? 1 : 0;
$producto->slug = Str::slug($request->nombre);
$producto->save();
return redirect('admin/producto');
}
public function edit($id){
$producto = Producto::find($id);
$categorias = Categoria::orderBy('nombre','ASC')->pluck('nombre','id');
return view('admin.producto.edit',compact("producto","categorias"));
}
public function update(Request $request, $id){
$producto = Producto::findOrFail($id);
$urlfotoanterior = $producto->urlfoto;
$producto->fill($request->all());
// tratamiento de imagenes
if ($request->hasFile('urlfoto')){
$rutaAnterior = public_path("/img/".$urlfotoanterior);
if ((file_exists($rutaAnterior)) && ($urlfotoanterior!=null)){ unlink (realpath($rutaAnterior)); }
$file = $request->file('urlfoto');
$nombre = $file->getClientOriginalName();
$file->move(public_path('/img/'),$nombre);
$producto->urlfoto = $nombre;
}
// fin tratamiento de imagenes
$producto->publicado= $request->publicado ? 1 : 0;
$producto->portada = $request->portada ? 1 : 0;
$producto->slug = Str::slug($request->nombre);
$producto->save();
return redirect('admin/producto');
}
public function destroy($id){
$producto=Producto::findOrFail($id);
$rutaAnterior = public_path("/img/".$producto->urlfoto);
if ((file_exists($rutaAnterior)) && ($producto->urlfoto!=null)){ unlink (realpath($rutaAnterior)); }
$producto->delete();
return redirect('admin/producto');
}
public function show($id){
Session::put("producto_id",$id);
return redirect('admin/precio');
}
}
@extends('layouts.admin')
@section('content')
<div class="container">
<div class="row justify-content-center">
@include("admin.menu")
<div class="col-sm-8">
<a href="/admin/categoria">{{$categoria->nombre}}</a> <br>
<a href="{{route("admin.producto.create")}}" class="btn btn-success">CREAR PRODUCTO</a>
<table class="table table-bordered">
<tr>
<th>ID</th>
<th>FOTO</th>
<th>NOMBRE</th>
<th>PRECIO</th>
<th>ACCIÓN</th>
</tr>
@forelse ($productos as $c)
<tr>
<td>{{$c->id}}</td>
<td><img src="/img/{{$c->urlfoto}}" width="100" class="border"> </td>
<td>
{{$c->nombre}}
<ul>
@forelse ($c->precios as $p)
<li>{{$p->nombre}} : {{$p->precio}}</li>
@empty
@endforelse
</ul>
</td>
<td>{{$c->precio}}</td>
<td>
<a href="{{route("admin.producto.show",$c->id)}}" class="btn btn-success">PRECIOS</a>
<a href="{{route("admin.producto.edit",$c->id)}}" class="btn btn-success">EDITAR PRODUCTO</a>
{!! Form::open(['method' => 'DELETE','route' => ['admin.producto.destroy', $c->id],'style'=>'display:inline']) !!}
{!! Form::submit('ELIMINAR PRODUCTO', ['class' => 'btn btn-success','onclick'=>'return confirm("¿Eliminar producto?")']) !!}
{!! Form::close() !!}
</td>
</tr>
@empty
<tr><td></td></tr>
@endforelse
</table>
</div>
</div>
</div>
@endsection
@extends('layouts.admin')
@section('content')
<div class="container">
<div class="row justify-content-center">
@include("admin.menu")
<div class="col-sm-8">
{!! Form::open(['route'=>'admin.producto.store','method'=>'POST','files'=>true]) !!}
<div class="form-group mt-3">
{!! Form::label('nombre','Nombre') !!}
{!! Form::text('nombre',null,['class'=>'form-control','required']) !!}
</div>
<div class="form-group mt-3">
{!! Form::label('descripcion','Descripción') !!}
{!! Form::textarea('descripcion',null,['class'=>'form-control','rows'=>3,'maxlength'=>'500']) !!}
</div>
<div class="form-group row mt-3">
<div class="col-sm-3">
{!! Form::label('precio','Precio') !!}
{!! Form::text('precio',null,['class'=>'form-control']) !!}
</div>
<div class="col-sm-3">
{!! Form::label('stock','Stock') !!}
{!! Form::text('stock',null,['class'=>'form-control','required']) !!}
</div>
<div class="col-sm-3">
{!! Form::label('orden','Orden') !!}
{!! Form::text('orden',null,['class'=>'form-control','required']) !!}
</div>
<div class="col-sm-3">
{!! Form::label('categoria_id', 'Categoría ') !!}
{!! Form::select('categoria_id', $categorias, null, ['class' => 'form-control', 'required'])!!}
</div>
</div>
<div class="form-group mt-3">
<div class="row">
<div class="col-md-3">
<div class="form-check form-switch">
{!! Form::checkbox('publicado',null,null,["class"=>"form-check-input"]) !!}
{!! Form::label('publicado','Publicado',["class"=>"form-check-label"]) !!}
</div>
</div>
<div class="col-md-3">
<div class="form-check form-switch">
{!! Form::checkbox('portada',null,null,["class"=>"form-check-input"]) !!}
{!! Form::label('portada','Portada',["class"=>"form-check-label"]) !!}
</div>
</div>
</div>
</div>
<div class="form-group mt-3">
{!! Form::label('urlfoto','Imagen',['class'=>'control-label']) !!}<br>
{!! Form::file('urlfoto',['class'=>'form-control']) !!}
</div>
<div class="form-group mt-3">
<a href="javascript: history.go(-1)" class="btn btn-outline-primary">Regresar</a>
{{ Form::submit('CREAR PRODUCTO',['class'=>'btn btn-success']) }}
</div>
{!! Form::close() !!}
</div>
</div>
</div>
@endsection
@extends('layouts.admin')
@section('content')
<div class="container">
<div class="row justify-content-center">
@include("admin.menu")
<div class="col-sm-8">
{!! Form::open(['route'=>['admin.producto.update',$producto],'method'=>'PUT',"files"=>true]) !!}
<div class="form-group mt-3">
{!! Form::label('nombre','Nombre') !!}
{!! Form::text('nombre',$producto->nombre,['class'=>'form-control','required']) !!}
</div>
<div class="form-group mt-3">
{!! Form::label('descripcion','Descripcion') !!}
{!! Form::textarea('descripcion',$producto->descripcion,['class'=>'form-control','rows'=>3,'maxlength'=>'500']) !!}
</div>
<div class="form-group row mt-3">
<div class="col-sm-3">
{!! Form::label('precio','Precio') !!}
{!! Form::text('precio',$producto->precio,['class'=>'form-control']) !!}
</div>
<div class="col-sm-3">
{!! Form::label('stock','Stock') !!}
{!! Form::text('stock',$producto->stock,['class'=>'form-control','required']) !!}
</div>
<div class="col-sm-3">
{!! Form::label('orden','Orden') !!}
{!! Form::text('orden',$producto->orden,['class'=>'form-control','required']) !!}
</div>
<div class="col-sm-3">
{!! Form::label('categoria_id', 'Categoría ') !!}
{!! Form::select('categoria_id', $categorias, $producto->categoria_id, ['class' => 'form-control', 'required'])!!}
</div>
</div>
<div class="form-group mt-3">
<div class="row">
<div class="col-md-3">
<div class="form-check form-switch">
{!! Form::checkbox('publicado',null,$producto->publicado,["class"=>"form-check-input"]) !!}
{!! Form::label('publicado','Publicado',["class"=>"form-check-label"]) !!}
</div>
</div>
<div class="col-md-3">
<div class="form-check form-switch">
{!! Form::checkbox('portada',null,$producto->portada,["class"=>"form-check-input"]) !!}
{!! Form::label('portada','Portada',["class"=>"form-check-label"]) !!}
</div>
</div>
</div>
</div>
<div class="form-group mt-3">
{!! Form::label('urlfoto','Imagen',['class'=>'control-label']) !!}<br>
<img src="/img/{{$producto->urlfoto}}">
{!! Form::file('urlfoto',['class'=>'form-control']) !!}
</div>
<div class="form-group mt-3">
<a href="javascript: history.go(-1)" class="btn btn-outline-primary">Regresar</a>
{{ Form::submit('ACTUALIZAR PRODUCTO',['class'=>'btn btn-success']) }}
</div>
{!! Form::close() !!}
</div>
</div>
</div>
@endsection
1031 visitas
« Capítulo 4 – Implementación del CRUD de Categorías
Capítulo 6 – Implementación CRUD Precios »
Descarga el código fuente del proyecto adquiriendo el curso completo
Comprar© Copyright Codea::App Cursos de Programación Online | LATAM | 2020 - 2024