Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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...