2
respostas

Método altera

Estou tendo problemas para cumprir o desafio. Eu consigo selecionar a opção de alterar na view Listagem porem ao listar novamente o campo alterado parece null no campo antigo e os dados que preenchi aparecessem como se eu tivesse criado um novo produto. Ou seja, ele cria um novo e deixa o antigo como null. Como arrumar isso?

public function altera($id) {
    $produtos = Produto::find($id);
    $produtos->nome = Request::input('nome');
    $produtos->valor = Request::input('valor');
    $produtos->descricao = Request::input('descricao');
    $produtos->quantidade = Request::input('quantidade');
    $produtos->save();

    return redirect()
      ->action('ProdutoController@novo');
  }
2 respostas

Oi Rafael, tudo bom?

Você ja verificou o id que está sendo passado no método altera?

algo como:

public function altera($id) {
    var_dump($id);die();
    $produtos = Produto::find($id);
    $produtos->nome = Request::input('nome');
    $produtos->valor = Request::input('valor');
    $produtos->descricao = Request::input('descricao');
    $produtos->quantidade = Request::input('quantidade');
    $produtos->save();

    return redirect()
      ->action('ProdutoController@novo');
  }

Normalmente, se o id estiver vazio, o ORM não vai detectar o produto antigo e criar um novo mesmo.

Se você quiser, compartilha mais do seu código aqui com a gente. A função altera não me parece ter nenhum problema.

Abraço

Ao dar o var_dump($id), quando vou inserir ele já puxa o id certo!

string(2) "62"

Você me pediu pra ver mais o código...

Controller:

class ProdutoController extends Controller
{

  public function lista() {
    $produtos = Produto::all(); //selecionando todos os dados de nosso banco
    //if(view()->exists('listagem')) { //se a pagina listagem existe...
      return view('produto/listagem', ['produtos' => $produtos]); //retorna o nome da pagina que queremos abrir
    //}
  }

  //a função mostra($id) coleta dados da tabela através do id do elemento, colocando em um vetor p todos os dados
  public function mostra($id) {
    $produtos = Produto::find($id);
    if (empty($produtos)) { //caso o dados seja vazio ...
      return "Esse produto não existe!"; // informe o erro
    }
    //retornando a view detalhes como o array p com o conteudo de $produto
    return view('produto/detalhes')->with('p', $produtos);
  }

  public function novo() {
    //retornando a pagina de formuláio para inserir o produto
    return view('produto/formulario');
  }

  /* COLETA DADOS DA VIEW E ADICIONA DADOS NO BANCO */
  public function adiciona() {
    //pode ser usado $all = Request::all();
    /* A partir daqui recolhemos os dados vindos do formulário */
    Produto::create(Request::all()); //com o metodo create() não precisamos usar o metodo save()
    //salva os paramentros inseridos no formulario na tabela (BD)

    return redirect()
      // action('ProdutoController@lista') irá redirecionar para a listagem de produtos apos incluir
      ->action('ProdutoController@lista')
      //Request::only('nome') refere-se ao nome do prodruto que será passado para a view apos inclui-lo
      ->withInput(Request::only('nome'));
  }

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

  public function altera($id) {
    var_dump($id);
    die();
    $produtos = Produto::find($id);
    $produtos->nome = Request::input('nome');
    $produtos->valor = Request::input('valor');
    $produtos->descricao = Request::input('descricao');
    $produtos->quantidade = Request::input('quantidade');
    $produtos->save();

    return redirect()
      ->action('ProdutoController@novo');
  }

  //esta função mostra um arquivo json com todos os dados inserido na tabela Produtos
  public function listaJson() {
    $produtos = Produto::all(); //selecionando todos os dados de nosso banco
    return response()->json($produtos);
  }
}

Rotas:

/* Route::get('path', função com a resposta) */
Route::get('/', function () { // "/" é a pagina default do projeto
    return '<h1>Primero projeto com Laravel</h1>';
});

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

/* Sempre devemos afirmar para a rota que nosso id será sempre um número */
Route::get('/produtos/mostra/{id}', 'ProdutoController@mostra')->where('id', '[0-9]+');

/* Rota que leva para a view do formulario */
Route::get('/produtos/novo', 'ProdutoController@novo');

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

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

//Rota para a função que remove produtos - public function remove()
Route::get('/produtos/remove/{id}', 'ProdutoController@remove');

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

View:

        ...
<td>
      <!-- href esta referenciando a função altera($id) da classe ProdutoController -->
      <a href="{{action('ProdutoController@altera', $p->id )}}"> Alterar </a>
    </td>

            ...

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software