Problema Relacionamento de Classes - LARAVEL

3 respostas
laravelwebhtml5php
V

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].

3 Respostas

D

Coloque a migrations de produtos por favor.

V

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');
    }
}
D

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.

Criado 15 de fevereiro de 2019
Ultima resposta 18 de fev. de 2019
Respostas 3
Participantes 2