3
respostas

Erro na utilização do Relacionamento.

Ao tentar mostrar a Categoria do Produto, estou recebendo a seguinte mensagem: Trying to get property of non-object. Codigo da listagem.blade.php

@extends('layout.principal')

@section('conteudo')
    <h1>Listagem de produtos</h1>
    @if(empty($produtos))

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

    @else
      <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->nome}} </td>
          <td><a href="/produtos/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
      </table>
    @endif
    @if(old('nome'))
      <div class="alert alert-success">
          <strong>Sucesso!</strong> O produto {{old('nome')}} foi adicionado.
      </div>
    @endif

@stop

Substituindo a marcação $p->categoria->nome por $p->categoria, retornou a um JSON no campo:

{"id":1,"nome":"Eletronico","created_at":"-0001-11-30 00:00:00","updated_at":"-0001-11-30 00:00:00"}

Codigo do Model Categoria

<?php namespace estoque;

use Illuminate\Database\Eloquent\Model;

class Produto extends Model {
    public $timestamps = false;
    protected $fillable = array('nome',  'valor', 'quantidade','descricao','tamanho','categoria_id');
    protected $guarded = ['id'];
    //

    public function categoria(){
        return $this->belongsTo('estoque\Categoria');
    }

}

Codigo do Model Produto:

<?php namespace estoque;

use Illuminate\Database\Eloquent\Model;

class Categoria extends Model {

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

}

Migrate da tabela Categoria

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCategoriasTable extends Migration {


    public function up()
    {
        Schema::create('categorias', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('nome',100);
            $table->timestamps();

        });
    }

    public function down()
    {
        Schema::drop('categorias');
    }

}

Migrate da adição do relacionamento na tabela Produto

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AdicionaRelacionamentoProdutoCategoria extends Migration {

    public function up()
    {
        Schema::table('produtos',function(Blueprint $table){
            $table->integer('categoria_id');
        });
    }


    public function down()
    {
        Schema::table('produtos',function(Blueprint $table){
            $table->dropColumn('categoria_id');
        });
    }

}
3 respostas

Fala Antonio, tudo bom?

Posso dar uma olhada no seu controller? =)

Olá André, tudo ótimo, segue controller

<?php namespace estoque\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Request;
use estoque\Produto;
use estoque\Categoria;
use estoque\Http\Requests\ProdutosRequest;

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

  public function listaJson(){
    $produtos = Produto::all();

    return $produtos;
  }

  public function lista(){

    $produtos = Produto::all();
    return view("produtos.listagem")->withProdutos($produtos);//$produtos;
  }
  public function mostra($id){
    $produto = Produto::find($id);
    if(empty($produto)) {
        return "Esse produto não existe";
    }
    return view("produtos.detalhe")->withP($produto);//$produtos;
  }

  public function novo(){
    return view("produtos.novo")->withCategorias(Categoria::all());
  }

  public function remove($id){
    $produto = Produto::find($id);
    $produto->delete();
    return redirect()
        ->action('ProdutoController@lista');
}
public function alterar($id){
  $produto = Produto::find($id);
  return view("produtos.alterar")->withProduto($produto);
}
public function altera(){
  $produto = Produto::find(Request::input('id'));
  $produto->nome = Request::input('nome');
  $produto->valor = Request::input('valor');
  $produto->descricao = Request::input('descricao');
  $produto->quantidade = Request::input('quantidade');
  $produto->tamanho = Request::input('tamanho');

  $produto->save();

  return redirect()
      ->action('ProdutoController@lista')
      ->withInput(Request::only('nome'));

}

  public function adiciona(ProdutosRequest $request){
    Produto::create($request->all());

    return redirect()
        ->action('ProdutoController@lista')
        ->withInput(Request::only('nome'));



  }
}

 ?>

Ola Antonio , o seu problema esta na forma em que você usa o metodo with. A forma correta de usar é :

return view('greeting')->with('Nome da propriedade na view', 'seu retorno ');

você fez da seguinte forma

 return view("produtos.detalhe")->withP($produto);//errado

 return view("produtos.detalhe")->with('p',$produto);//correto