Laravel eliminar en CRUD

publicado por: Anonymous

Estoy creando un CRUD de productos.
En el index tengo la rejilla con los registros.
En cada registro hay dos botones (editar y eliminar).
El editar me funciona bien, pero el eliminar no.
Necesito que al pulsar ese botón me muestre una vista (borrar.blade.php) que es un formulario donde deben aparecer los datos de ese registro, y al darle al botón eliminar de ese formulario, me lo elimine.
He probado de muchas maneras, pero pongo el código de lo que tengo ahora.
En ProductoController.php:

public function borrar($id){
    $producto=AppProducto::find($id);
    return view('productos.borrar')->with('producto',$producto);
}
public function destroy($id){
    $producto=AppProducto::find($id);
    $producto->destroy($id);
    return view('productos.destroy',['id'=>$id]);
}

En borrar.blade.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Eliminar Producto</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
   <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
    <div class='container'>
        <div class='jumbotron'>
            <h1>Eliminar Producto</h1>
            <p>Introduce todos los datos para eliminar un producto en la base de datos.</p>
        </div>
        <form name='formularioeliminar' action='{{'productos/destroy'}}' method='get'>
        <div class='form-group'>
            {{csrf_field()}}
            <label for='id'>Introduce el id del producto:</label>
            <input type='number' class='form-control' placeholder='Introduce el id' name='id' value="{{$producto->id}}"><br>
            <label for='id'>Introduce el nombre del producto:</label>
            <input type='text' class='form-control' placeholder='Introduce el nombre' name='nombre' value="{{$producto->nombre}}" size=30><br>
            <label for='precio'>Introduce el precio del producto:</label>
            <input type='decimal' class='form-control' placeholder='Introduce el precio' name='precio' value="{{$producto->precio}}"><br>
        </div>
        <div class='botons-group'>
            <input type='submit' name='eliminar' value='ELIMINAR'>
            <input type="button" onclick="history.back()" name="volver" value="VOLVER">
        </div>
        </form>
    </div>
    <?php
        if(isset($_GET['borrar'])){
            //buscar();
            ?>{{productos.borrar}}<?php
        }
        if(isset($_GET['volver'])){
            //header("Location:productos/index");
            ?> <a href="{{ url('productos.index') }}"></a> <?php
        }
    ?>
</body>
</html>

En destroy.blade.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Eliminar Producto</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
   <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<?php
    function conectar(){
        $con=mysqli_connect("localhost","root","","dam2d-laravel");
        return $con;
    }
    function desconectar(){
        mysqli_close(conectar());
    }
    conectar();
    $id=isset($_GET['id']) ? $_GET['id'] : '';
    $nombre=isset($_GET['nombre']) ? $_GET['nombre'] : '';
    $precio=isset($_GET['precio']) ? $_GET['precio'] : '';
    function eliminar(){
        $id=$_GET['id'];
        $nombre=$_GET['nombre'];
        $precio=$_GET['precio'];
        $esta=false;
        if(conectar()->connect_error){
            die('Error de conexion: '.conectar()->connect_error);
        }else{
            $sql="SELECT * FROM productos where id='".$id."'";
            $resul=mysqli_query(conectar(),$sql);
            while($linea=mysqli_fetch_array($resul)){
                $esta=true;
            }
            if($esta==false){
                echo "No existe ningún producto con el id ".$id;
            }
            if(!mysqli_query(conectar(),"DELETE FROM productos WHERE id='".$id."'")){
                echo "No se ha eliminado el producto!".mysqli_error(conectar());
            }else{
                echo "Producto eliminado!";
            }
        }
    }
    desconectar();
?>
</body>
</html>

En web.php:

Route::resource('productos','ProductoController');
Route::view('productos/borrar/{id}','[email protected]');

El botón que hay en la rejilla del index:

<a href="{{route('productos.borrar',$producto->id)}}" class="btn btn-danger">ELIMINAR</a>

Ni siquiera me muestra la página borrar. Creo que el problema podría estar en la manera de llamar a alguna vista o a alguna variable de las que hay que pasar a la vista formulario borrar.blade.php.

solución

Esta ruta esta bien:

Route::resource('productos','ProductoController');

Esta ruta la cambiaría de view a get:

Route::get('productos/borrar/{id}',[email protected]');

Colócalas así:

Route::get('productos/borrar/{id}',[email protected]');
Route::resource('productos','ProductoController');

Después en [email protected] ya debería cargar tu vista productos.borrar.

Tu formulario debería ser algo así:

<form name='formularioeliminar' action='{{ route('productos.destroy', $producto->id) }}' method='DELETE'>

En destroy.blade.php te sugiero que elimines el siguiente código, porque no es necesario si estas utilizando Laravel.

<?php
function conectar(){
    $con=mysqli_connect("localhost","root","","dam2d-laravel");
    return $con;
}
function desconectar(){
    mysqli_close(conectar());
}
conectar();
$id=isset($_GET['id']) ? $_GET['id'] : '';
$nombre=isset($_GET['nombre']) ? $_GET['nombre'] : '';
$precio=isset($_GET['precio']) ? $_GET['precio'] : '';
function eliminar(){
    $id=$_GET['id'];
    $nombre=$_GET['nombre'];
    $precio=$_GET['precio'];
    $esta=false;
    if(conectar()->connect_error){
        die('Error de conexion: '.conectar()->connect_error);
    }else{
        $sql="SELECT * FROM productos where id='".$id."'";
        $resul=mysqli_query(conectar(),$sql);
        while($linea=mysqli_fetch_array($resul)){
            $esta=true;
        }
        if($esta==false){
            echo "No existe ningún producto con el id ".$id;
        }
        if(!mysqli_query(conectar(),"DELETE FROM productos WHERE id='".$id."'")){
            echo "No se ha eliminado el producto!".mysqli_error(conectar());
        }else{
            echo "Producto eliminado!";
        }
    }
}
desconectar();
?>

y cambia en tu función destroy lo siguiente:

public function destroy($id) {
    $producto = Producto::find($id);
    $producto->delete();

    // return view('cualquier.vista');  
}

Para que te funcione lo siguiente

<a href="{{route('productos.borrar',$producto->id)}}" class="btn btn-danger">ELIMINAR</a>

Tendrías que agregarle name a tu ruta:

Route::get('productos/borrar/{id}',[email protected]')->name('productos.borrar');

Lo anterior son cosas que veo a simple vista, espero te ayude para que sigas investigando y probando, puesto que la pregunta es MUY abierta, te va a surgir uno que otro obstáculo, saludo.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *