Capitulo 5 del Módulo 2 Panel de Administración

➜ Implementación CRUD Productos

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.

App\Models\Producto.php

<?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);
    }
}

 

Migración 

<?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');
    }
};

App\Http\Controllers\ProductoController.php

<?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');
    }
}

 

resources/views/admin/index.blade.php

@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

 

resources/views/admin/create.blade.php

@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

resources/views/admin/edit.blade.php

@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

1406 visitas

Descarga el código del proyecto

Descarga el código fuente del proyecto adquiriendo el curso completo

Comprar

¡Qué aprenderás?

tooltip bs-tooltip-top bs-tooltip-end bs-tooltip-bottom bs-tooltip-start show fade tooltip-inner

Codea Applications

México, Colombia, España, Venezuela, Argentina, Bolivia, Perú