1
resposta

Trying to get property of non-object

Bom dia senhores,

Estou tendo um problema para retornar item selecionado na listagem de produtos. O item passa o id por parâmetro mas quando selecionado aparece uma página informando uma mensagem no assunto : 'Trying to get property of non-object'.

Dentro do método mostrar eu estou usando print_r($produtos).die(); e ele me retornr um array abaixo:

Array ( [0] => stdClass Object ( [id] => 1 [nome] => Geladeira [valor] => 5900.00 [descricao] => Side by Side com gelo na porta [quantidade] => 2 ) )

e quando eu chego na página detalhes eu utilizo o script:

<?php   
    print_r($produto);die();
 ?>

é exibido também um array.

Segue o código dos métodos do controle e do arquivo PHP;

ProdutoController

<?php namespace estoque\Http\Controllers;


use Illuminate\Support\Facades\DB;

use Request;

class ProdutoController extends Controller
{
    public function lista(){

        $produtos = DB::select('select * from produtos');

        return view('listagem')->with('produtos', $produtos);
    }
    public function mostra(){

        $id = 1; // no exercício já fica setado só para fins de explicação.

        $produto = DB::select('select * from produtos where id = ?', [$id]);
        //print_r($produto);die();
        return view('detalhes')->with('produto', $produto);

    }
}

detalhes.php

<!DOCTYPE html>
<html>
<head>
    <title>Listagem de Estoques</title>
    <link rel="stylesheet" type="text/css" href="/css/app.css">
</head>
<body>
    <div class="container">        
        <h1>Detalhes do produto: <?= $produto->nome ?> </h1>
        <ul>    
          <li>
            <b>Valor:</b> R$ <?= $produto->valor ?> 
          </li>
          <li>
            <b>Descrição:</b> <?= $produto->descricao ?> 
          </li>
          <li>
            <b>Quantidade em estoque:</b> <?= $produto->quantidade ?>
          </li>
        </ul>
    </div>
</body>
</html>

segue o arquivo de rotas: Route.php

<?php

Route::get('/', function(){

    return '<h1>Segunda lógica com Laravel</h1>';

});    

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

Gostaria que alguém me desse uma explicação e o que fazer a respeito. Cordialmente, Rafael

1 resposta

Oi Rafael, tudo bom?

O método chamado:

        $produto = DB::select('select * from produtos where id = ?', [$id]);

Realize um select no banco. Entretanto, o framework sempre devolve uma lista pois a query pode ou não devolver um unico valor. Por exemplo, aqui:

        $produtos = DB::select('select * from produtos');

Temos uma seleção multipla.

Pelo retorno:

Array ( [0] => stdClass Object ( [id] => 1 [nome] => Geladeira [valor] => 5900.00 [descricao] => Side by Side com gelo na porta [quantidade] => 2 ) )

Temos um array, com um valor só. Que é exatamente o valor que a gente queria, de id 1. Acredito que acessar a primeira posição do array antes de retornar para a view resolva. Algo como:

public function mostra(){

        $id = 1; // no exercício já fica setado só para fins de explicação.

        $produto = DB::select('select * from produtos where id = ?', [$id]);

        return view('detalhes')->with('produto', $produto[0]);

    }

Abraço

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