1
resposta

Update usando o Eloquent ORM

Estou tentando fazer a função de alterar os dados dos produtos, para isso fiz da seguinte forma:

Criei uma rota para exibir o formulário com os dados preenchidos, assim como uma rota para efetuar o update:


<?php

Route::get('/', function()
{
  return '<h1>Primeira lógica com Laravel</h1>';
})

Route::get('/produtos', 'ProdutoController@lista');

Route::get('/produtos/mostra/{id}', 'ProdutoController@mostra')->where('id', '[0-9]+');

Route::get('/produtos/novo', 'ProdutoController@novo');

Route::post('/produtos/adiciona', 'ProdutoController@adiciona');

Route::get('/produtos/remove/{id}', 'ProdutoController@remove');

Route::get('/produtos/busca/{id}', 'ProdutoController@busca')->where('id', '[0-9]+');

Route::post('/produtos/altera', 'ProdutoController@altera');

Criei uma view para exibir o formulário com os dados do produto preenchido, para que o usuário possa alterar:


@extends('layout/principal')

@section('conteudo')
<div class="container">
<h1>Alterar Produto {{$p->nome}}</h1>

<form action="http://kingstecnologia.com.br/estoque/public/produtos/altera" method="post">
    {{ csrf_field() }}
    <div class="form-group">
    <label>Nome</label>
    <input type="hidden" name="id" value="{{$p->id}}">
    <input class="form-control" type="text" name="nome" value="{{$p->nome}}" />

    <label>Valor</label>
    <input class="form-control" type="number" name="valor" value="{{$p->valor}}"/>

    <label>Descrição</label>
    <input class="form-control" type="text" name="descricao" value="{{$p->descricao}}" />

    <label>Quantidade</label>
    <input class="form-control" type="number" name="quantidade" value="{{$p->quantidade}}"/>

    <button type="submit">Salvar</button>
    </div>
    </form>
</div>

@stop

E no Controller criei duas funções a busca(Retorna os dados do produto para preencher o formulário) e altera (Faz o update no banco).


<?php 
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Request;
use App\Produto;

class ProdutoController extends Controller{

    public function lista(){

        $produtos = Produto::all();

        return view('produto/listagem')->with('produtos', $produtos);
    }



    public function mostra($id){

        $resposta = produto::find($id);

        if(empty($resposta)) {
            return "Esse produto não existe";
          }
          return view('produto/detalhes')->with('p', $resposta);
    }


    public function novo(){

        return view('produto/formulario');
    }


    public function adiciona(){
        // pegar dados do formulario
        Produto::create(Request::all());

        // retornar alguma view
        return redirect()->action('ProdutoController@lista')->withInput(Request::only('nome'));

    }

    public function remove($id){
        $produto = Produto::find($id);
        $produto->delete();
        return redirect()
            ->action('ProdutoController@lista');
    }

    public function busca($id){
        $resposta = produto::find($id);

        if(empty($resposta)) {
            return "Esse produto não existe";
          }
          return view('produto/formularioAltera')->with('p', $resposta);
    }

    public function altera(){
        $params = Request::all();
        $produto = new Produto($params);
        $produto->save();

    return redirect()->action('ProdutoController@lista')->withInput(Request::only('nome'));


    }

}

?>

Quando executo a função altera o sistema da erro "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '45' for key 'PRIMARY' (SQL: insert into produtos (id, nome, valor, descricao, quantidade) values (45, Aiua, , 2, 2))"

devido já ter um produto com o mesmo id, sendo que é exatamente isso que desejo, pois quero fazer um update.

Gostaria de ajuda para solucionar o problema usando os recursos do Eloquent, pois em SQL sei fazer.

1 resposta

Boa noite Aiua,

Você pode fazer dessa forma,

public function altera($id) {
    $params = Request::all();
    $produto = Produto::find($id);
    $produto->update($params);

    return redirect()->action('ProdutoController@lista')->withInput(Request::only('nome'));


    }

Senão der certo poste novamente que tento ajudar.

Vlw