9
respostas

Erro ao trazer as categorias.

Olá pessoal! Estou enfrentando um erro ao tentar buscar as minhas categorias do banco de dados. Quando chamo {{$p->categoria_id}} ele trás os valores, mas quando eu chamo {{$p->categorias->nome}} ele não trás os nomes. O erro apresentado é Trying to get property of non-object, sei que já existe uma pergunta com esse erro aqui no forum, mas no caso dele era um erro de sintaxe.

listagem.blade.php

    @extends('layout.principal')
    @section('conteudo')
    @if(empty($produtos))

    <div class="alert alert-danger">
        Você não tem nenhum produto cadastrados!
    </div>

    @else

    <h1>Listagem de produtos</h1>    
    <table class=" table table-striped table-bordered table-hover">

        @foreach ($produtos as $p)        
            <tr class="{{$p->quantidade <=1 ? 'danger' : ''}}">
                <td> {{$p->nome}}  </td>
                <td> {{$p->valor}} </td>
                <td> {{$p->descricao}}  </td>
                <td> {{$p->quantidade}} </td>
                <td> {{$p->tamanho}} </td>
                <td> {{$p->categorias->nome}} </td>
                <td>
                    <a href="{{action('ProdutoController@mostra', $p->id)}}">
                        <span class="glyphicon glyphicon-search"></span>
                    </a>
                </td>
                <td>
                    <a href="{{action('ProdutoController@remove', $p->id)}}">
                        <span class="glyphicon glyphicon-trash"></span>
                    </a>
                </td>
                <td>
                    <a href="{{action('ProdutoController@alterar', $p->id)}}">
                        <span class="glyphicon glyphicon-edit"></span>
                    </a>
                </td>
            </tr>
        @endforeach
        @endif
    </table>    
    <h4>
        <span class="label label-danger pull-right">
            Um ou menos itens no estoque.
        </span>
    </h4><br>
        @if(old('nome'))
            <div class="alert alert-success">
                Produto {{old('nome')}} adicionado com sucesso!
            </div>
        @endif
    @stop
</code>

<code>ProdutoController.php</code>
<?php
namespace estoque\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Request;
use Validator;
use estoque\Produto;
use estoque\Categoria;
use estoque\Http\Requests\ProdutoRequest;

class ProdutoController extends Controller{
    public function __construct()
    {
        $this->middleware('auth', ['only' => ['adiciona', 'remove', 'alterar']]);
    }
    public function Lista(){        

        $produtos = Produto::all();        
        return view('produto.listagem')->with('produtos', $produtos);
    }
    public function mostra($id){

        $produto = Produto::find($id);
        if(empty($produto)){
            return "Esse produto não existe";
        }
        return view('produto.detalhes')->with('p', $produto);
    }
    public function remove($id){

        $produto = Produto::find($id);
        $produto->delete();
        return redirect()->action('ProdutoController@Lista');
    }
    public function formulario(){        
        return view('produto.formulario')->with('categorias', Categoria::all());
    }
    public function adiciona(ProdutoRequest $request){

        Produto::create($request->all());
        return redirect()->action('ProdutoController@Lista')->withInput(Request::only('nome'));
    }
    public function listaJson(){
        $produtos = Produto::all();
       return response()->json($produtos);
    }
    public function alterar($id){

        $produto = Produto::find($id);
        $categorias = Categoria::all();        
        return view('produto.alterar')->with('p', $produto)->with('categorias', $categorias);

    }
    public function alterado(ProdutoRequest $request, $id){

        $produto = Produto::find($id);
        $params = $request->all();
        $produto->update($params);

        return redirect()->action('ProdutoController@Lista');

    }

}

Alguém pode me ajudar?

9 respostas

O código da listagem que não foi certo


    <h1>Listagem de produtos</h1>    
    <table class=" table table-striped table-bordered table-hover">

        @foreach ($produtos as $p)        
            <tr class="{{$p->quantidade <=1 ? 'danger' : ''}}">
                <td> {{$p->nome}}  </td>
                <td> {{$p->valor}} </td>
                <td> {{$p->descricao}}  </td>
                <td> {{$p->quantidade}} </td>
                <td> {{$p->tamanho}} </td>
                <td> {{$p->categoria_id}} </td>
                <td>
                    <a href="{{action('ProdutoController@mostra', $p->id)}}">
                        <span class="glyphicon glyphicon-search"></span>
                    </a>
                </td>
                <td>
                    <a href="{{action('ProdutoController@remove', $p->id)}}">
                        <span class="glyphicon glyphicon-trash"></span>
                    </a>
                </td>
                <td>
                    <a href="{{action('ProdutoController@alterar', $p->id)}}">
                        <span class="glyphicon glyphicon-edit"></span>
                    </a>
                </td>
            </tr>
        @endforeach
        @endif
    </table>    
    <h4>
        <span class="label label-danger pull-right">
            Um ou menos itens no estoque.
        </span>
    </h4><br>
        @if(old('nome'))
            <div class="alert alert-success">
                Produto {{old('nome')}} adicionado com sucesso!
            </div>
        @endif
    @stop

Thamires, tudo bem? Posta aqui o seu modelo Produto.php pra gente ver se está tudo certo nele?

<?php

namespace estoque;

use Illuminate\Database\Eloquent\Model;

class Produto extends Model
{
    protected $table = 'produtos';
    public $timestamps = false;

    protected $fillable = array('nome', 'descricao', 'quantidade', 'valor', 'tamanho', 'categoria_id');

    protected $guarded = ['id'];

    public function categoria(){

        return $this->belongsTo('estoque\Categoria');
    }

}

Thamires, tenta utilizar o mesmo que você usou antes para exibir o nome da categoria, usando apenas o nome da função que faz o relacionamento (função que tem o belongsTo) da seguinte forma:

{{$p->categoria->nome}}

Vê se funciona? Fico no aguardo =)

Apresentou o mesmo erro :(

Cola seu modelo Categoria aqui por favor?

<?php

namespace estoque;

use Illuminate\Database\Eloquent\Model;

class Categoria extends Model
{
    protected $table = 'categorias';

    public function produtos(){
        return $this->hasMany('estoque\Produto');
    }
}

Ainda não consigo identificar o problema :(

Este erro indica que a propriedade categoria do objeto não é um outro objeto, mas que deveria ser.

Neste caso, vamos ver o que é que o laravel está retornando pra view. usa este código na listagem: {{dd($p)}} e cola aqui o resultado. Esse dd vai imprimir todas as propriedades e metodos do objeto produto. Vai imprimir de todos os produtos por causa do laço, então cola aqui só um dos resultados, tá bem?

O retorno que eu recebi foi esse

Produto {#213 ▼
  #table: "produtos"
  +timestamps: false
  #fillable: array:6 [▼
    0 => "nome"
    1 => "descricao"
    2 => "quantidade"
    3 => "valor"
    4 => "tamanho"
    5 => "categoria_id"
  ]
  #guarded: array:1 [▼
    0 => "id"
  ]
  #connection: null
  #primaryKey: "id"
  #keyType: "int"
  #perPage: 15
  +incrementing: true
  #attributes: array:7 [▼
    "id" => 1
    "nome" => "Geladeira"
    "valor" => "5900.00"
    "descricao" => "Side by Side com gelo na porta"
    "quantidade" => 2
    "tamanho" => "20x40cm"
    "categoria_id" => 7
  ]
  #original: array:7 [▼
    "id" => 1
    "nome" => "Geladeira"
    "valor" => "5900.00"
    "descricao" => "Side by Side com gelo na porta"
    "quantidade" => 2
    "tamanho" => "20x40cm"
    "categoria_id" => 7
  ]
  #relations: array:1 [▼
    "categoria" => Categoria {#187 ▼
      #table: "categorias"
      #connection: null
      #primaryKey: "id"
      #keyType: "int"
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:4 [▼
        "id" => 7
        "nome" => "ELETRODOMESTICO"
        "created_at" => "2016-12-08 15:58:56"
        "updated_at" => "2016-12-08 15:58:56"
      ]
      #original: array:4 [▼
        "id" => 7
        "nome" => "ELETRODOMESTICO"
        "created_at" => "2016-12-08 15:58:56"
        "updated_at" => "2016-12-08 15:58:56"
      ]
      #relations: []
      #hidden: []
      #visible: []
      #appends: []
      #fillable: []
      #guarded: array:1 [▼
        0 => "*"
      ]
      #dates: []
      #dateFormat: null
      #casts: []
      #touches: []
      #observables: []
      #with: []
      +exists: true
      +wasRecentlyCreated: false
    }
  ]
  #hidden: []
  #visible: []
  #appends: []
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  +exists: true
  +wasRecentlyCreated: false
}