Problema Relacionamento de Classes - LARAVEL

Boa noite, gostaria de um help de vocês. Meu relacionamento de classes não está funcionando, gostaria de saber como faço pra acessar da view. Não sei se o problema está no relacionamento ou na sintaxe de monstrar na view. :confused: . O que estou tentando fazer é o seguinte UMA COMPRA PODE TER UM OU VÁRIOS PRODUTOS.

No caso minha tabela COMPRA está assim:

  • id
  • id_produto
  • id_carrinho

Então a partir do id_produto na tabela COMPRA eu queria pegar os atributos de produtos. Segue os códigos abaixo:

MODEL COMPRA

class Compra extends Model {

    public function carrinho(){
      return $this->belongsTo('App\Carrinho');
    }

    public function produto(){
        return $this->hasMany(Produto::class, 'id_produto');
    }
}

MODEL PRODUTO

class Produto extends Model{

    public function compra(){
      return $this->belongsTo(Compra::class);
    }
}

MIGRATION COMPRAS

public function up()
{
    Schema::create('compras', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('id_carrinho');
        $table->integer('id_produto');
        $table->integer('qtde_produto');
        $table->timestamps();

        $table->foreign('id_carrinho')->references('id')->on('carrinhos');
        $table->foreign('id_produto')->references('id')->on('produtos');

    });
}

TENTANDO ACESSA:

$produtos = Compra::with('id_produto')->get();

Dai aparece esse erro:

Call to undefined relationship [id_produto] on model [App\Compra].

Coloque a migrations de produtos por favor.

A migration de compras está no tópico, a de produto é essa

<?php

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

class CreateProdutosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('produtos', function (Blueprint $table) {
            $table->increments('id');
            $table->string('nome');
            $table->string('ingredientes');
            $table->string('preco');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('produtos');
    }
}

Primeiro:

Configurar os models corretamente mediante as duas migrations:

Produto

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Produto extends Model
{
    protected $fillable = ['nome','ingredientes','preco'];
    protected $table = 'produtos';
    protected $primaryKey = 'id';

    public function compras()
    {
        return $this->hasMany(Compra::class, 'id_produto', 'id');
    }
}

Compra

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Compra extends Model
{
    protected $fillable = ['id_carrinho','id_produto','qtde_produto'];
    protected $table = 'compras';
    protected $primaryKey = 'id';

    public function produto()
    {
        return $this->belongsTo(Produto::class, 'id_produto', 'id');
    }
}

Segundo:

Testando e carregamento as relações:

$compras = Compra::with('produto')->get();
$produto = Produto::with('compras')->get();

Observação: no método with recebe o nome do método e não o nome da chave como está na sua pergunta.

Tudo que está montando é mediante a sua migration, apesar que faltou montar a relação do carrinho a que está na pergunta foi feita.

Dê uma lida na documentação sobre as relações possíveis do model

Existe outras mas, essas acho as essenciais para primeiro entendimento.