Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Desafio update

Olá para todos, será que alguém consegue me dizer aonde estou errando? Não estou conseguindo fazer o update. Já tentei de várias maneiras... Não apresenta nenhum erro...

Seguem os códigos:

Routes:

<?php

Route::get('/', function () {
    //return '<h1>Listagem de produtos</h1>';
    return view('/index');
});

Route::get('produtos', 'ProdutoController@lista');
Route::get('produtos/mostra/{id}', 'ProdutoController@mostra');
Route::get('produtos/alterar/{id}', 'ProdutoController@alterar');
Route::post('produtos/alterado/{id}', 'ProdutoController@alterado');
Route::get('produtos/remove/{id}', 'ProdutoController@remove');
Route::get('produtos/novo', 'ProdutoController@novo');
Route::post('produtos/adiciona', 'ProdutoController@adiciona');
Route::get('produtos/json', 'ProdutoController@json');

//Route::get('home', 'HomeController@index');
//Route::get('/home', 'HomeController@index');

Route::auth();

Route::controllers([
    'auth' => 'Auth\AuthController',
    'password' => 'Auth\PasswordController',
]);

Form:

@extends('layout.main')

@section('content')

<h1 class="center">Atualizar produto: #{{$p->id}}</h1>
<form action="/produtos/alterado/{{$p->id}}" method="post">

    <input type="hidden" name="_token" value="{{csrf_token()}}">

    <div class="form-group">
       <label>Nome</label>
        <input id="nome" name="nome" class="form-control" placeholder="{{$p->nome}}">
    </div>
    <div class="form-group">
       <label>Valor</label>
        <input id="valor" name="valor" class="form-control" placeholder="{{$p->valor}}">
    </div>
    <div class="form-group">
       <label>Quantidade</label>
        <input id="quantidade" name="quantidade" class="form-control" type="number" placeholder="{{$p->quantidade}}">
    </div>
  <div class="form-group">
    <label>Tamanho</label>
    <input id="tamanho" name="descricao" class="form-control" placeholder="{{$p->tamanho}}">
  </div>
    <div class="form-group">
        <label for="categoria">Categoria</label>
        <select name="categoria_id" class="form-control">
            @foreach($categorias as $c)
                <option value="{{ $c->id }}">{{ $c->nome }}</option>
            @endforeach
        </select>
    </div>
  <div class="form-group">
    <label>Descrição</label>
    <textarea id="descricao" name="descricao" class="form-control" placeholder="{{$p->descricao}}"></textarea>
  </div>
    <button type="submit" class="btn btn-primary">Atualizar</button>

</form>
@stop

Controller:

public function alterar($id){
            $produto = Produto::find($id);
            $categorias = Categoria::all();

            return view('produtos/alterar')
              ->with('p', $produto)
              ->with('categorias', Categoria::all());
          }

          public function alterado(ProdutoRequest $request, $id){
            $produto = Produto::find($id);
            $parametros = Request::all();
            $produto->update($parametros);

            return redirect()
              ->action('ProdutoController@lista')
              ->withInput();
          }
11 respostas

aparentemente esta tudo correto, porem você poderia usar a função debug do Laravel nessa linha e ver se esta dando true ou false

dd($produto->update($parametros));

e você pode ver o log dentro da pasta store/log

Aparentemente os valores do formulário não estão sendo recebidos para ser feito o update.

Segue o Debug...

Debug:

estoque\Produto {#289
  #table: "produtos"
  +timestamps: false
  #fillable: array:6 [
    0 => "nome"
    1 => "valor"
    2 => "quantidade"
    3 => "tamanho"
    4 => "categoria_id"
    5 => "descricao"
  ]
  #connection: null
  #primaryKey: "id"
  #keyType: "int"
  #perPage: 15
  +incrementing: true
  #attributes: array:7 [
    "id" => 91
    "nome" => "Nintendo Wii"
    "valor" => "1200"
    "descricao" => "Nintendo"
    "quantidade" => 14
    "tamanho" => "45cm x 50cm"
    "categoria_id" => 11
  ]
  #original: array:7 [
    "id" => 91
    "nome" => "Nintendo Wii"
    "valor" => "1200"
    "descricao" => "Nintendo"
    "quantidade" => 14
    "tamanho" => "45cm x 50cm"
    "categoria_id" => 11
  ]
  #relations: []
  #hidden: []
  #visible: []
  #appends: []
  #guarded: array:1 [
    0 => "*"
  ]
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  #morphClass: null
  +exists: true
  +wasRecentlyCreated: false
}

Tenta usar o request que esta como parâmetro $request->all(). Caso isso não resolva seu problema me mande um debug do desse request all.

Eu fiz umas alterações no $request e mesmo assim não funcionou, não estou sabendo nem mais o que tentar, não deveria ser tão complicado assim...

     public function alterar($id){
            $produto = Produto::find($id);
            $categorias = Categoria::all();

            return view('produtos/alterar')
              ->with('p', $produto)
              ->with('categorias', Categoria::all());
          }

          public function alterado(ProdutoRequest $request, $id){
            $produto = Produto::find($id);
            $parametros = $request->all();
            $produto->update($parametros);

            return redirect()->action('ProdutoController@lista');
              //->withInput();
          }

Veja se as chaves que estão vindo no seu $request->all() refletem na sua tabela

Muito obrigado Alan Gomes, consegui fazer funcionar as atualizações. Quando eu defini o atributo 'value' na tabela de editar funcionou.

 <div class="form-group">
   <label>Nome</label>
   <input id="nome" name="nome" class="form-control" value="{{ $p->nome }}" >
 </div>

Porém só não consegui receber os dados da descrição do produto, e nem a sua categoria corretamente do banco de dados, devo abrir outro tópico?

Veja como está no formulário de editar

  <div class="form-group">
    <label for="categoria">Categoria</label>
    <select name="categoria_id" class="form-control" value="{{ $p->categoria_id }}">
      @foreach($categorias as $c)
        <option value="{{ $c->id }}">{{ $c->nome }}</option>
      @endforeach
    </select>
  </div>

  <div class="form-group">
    <label>Descrição</label>
    <textarea id="descricao" name="descricao" class="form-control" value="{{ $p->descricao }}"></textarea>
  </div>

É sem valeu fica complicado fazer update :). Valdir me passa o debug do seu request all para eu ver oque esta vindo dentro dele para entender melhor oque esta acontecendo.

Olá Alan Gomes, não estou sabendo fazer o debug específico que você pediu, então estou te passando o código da página de edição, reparei que o value da categoria vem certo do banco, nesse caso está 'value="2"', e no formulário retorna o primeiro item da lista.

  <div class="form-group">
    <label for="categoria">Categoria</label>
    <select name="categoria_id" class="form-control" value="{{ $p->categoria_id }}">
      @foreach($categorias as $c)
        <option value="{{ $c->id }}">{{ $c->nome }}</option>
      @endforeach
    </select>
  </div>
solução!

o erro esta no seu select, neste campo não tem value :).

correção

<div class="form-group">
    <label for="categoria">Categoria</label>
    <select name="categoria_id" class="form-control" >
      @foreach($categorias as $c)
    @if($c->id  ==  $p->categoria_id )
        <option selected value="{{ $c->id }}">{{ $c->nome }}</option>
    @else
        <option value="{{ $c->id }}">{{ $c->nome }}</option>
    @endif        
      @endforeach
    </select>
  </div>

Ok entendi, obrigado pela atenção...