Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Não consigo fazer o Relacionamento no Laravel

Eu não estou conseguindo fazer o relacionamento, o erro que da é:

Trying to get property of non-object

Mudei algumas coisa que considero insignificativas do código que ele usou. O professor criou a tabela pela migration e eu fiz no próprio banco já inserindo a chave estrangeira, além dele usar como o id da categoria na tabela produtos: categoria_id, eu inverti: id_categoria. O resto esta igual, não sei por que não funciona. Segue os códigos:

Listagem:

@foreach($produtos as $p)
    <tr class="{{$p->quantidade <= 1 ? 'danger' : ''}}">
        <td><?=$p->nome?></td>
        <td><?=$p->valor?></td>
        <td><?=$p->descricao =  $p->descricao != null ? $p->descricao : '<hr>'?></td>
        <td><?=$p->quantidade?></td>
        <td><?=$p->tamanho =  $p->tamanho != null ? $p->tamanho : '<hr>'?></td>
        <td><?=$p->categoria->id?></td>
        <td>
            <a href="{{action('ProdutoController@mostra', $p->id)}}">
                <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
            </a>
        </td>
        <td>
            <a href="{{action('ProdutoController@altera', $p->id)}}">
                        <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
            </a>
        </td>
        <td>
            <a href="{{action('ProdutoController@remove', $p->id)}}">
                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
            </a>
        </td>
    </tr>
@endforeach

Produto

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

    protected $fillable = array('nome', 'valor', 'descricao', 'quantidade', 'tamanho', 'id_categoria');
    protected $guarded = ['id'];

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

}

Categoria

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

Controller

public function lista(){
        $produtos = Produto::all();
        return view('produto.listagem')->with('produtos', $produtos);
}
3 respostas
solução!

Decidi mudar o nome de id_categoria para categoria_id, como no exercício e resolveu. Alguém sabe dizer o por que?

Oi Alexandre, tudo bom?

isso acontece porque o eloquent gera as tabelas pra gente no banco e o padrão é adicionar o sufixo _id pra representar o relacionamento da entidades no banco. Então, no banco, ele sempre vai gerar categoria_id mesmo.

Que bom que resolveu =)

Qualquer problema é só falar.

Abraço!

Tem como eu mudar esse nome? Pois pretendo usar o Laravel no meu tcc e aprendemos a usar mnemônicos para o banco, desta forma mudaria o nome, seria cd_categoria e não funcionaria.