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

Não consigo fazer o relationship

Já acabei o curso e estou aplicando o laravel em um projeto que tenho, mas estou com um problema para relacionar a class Projeto com a Cliente. Em "Projeto" eu tenho o cliente_id e quando vou exibir o projeto eu quero exibir o nome do cliente. Segui o exemplo da categoria, mas não está aparecendo o nome do cliente e nem dando erro! Não estou consegui encontrar a solução... Pode me ajudar?

Projeto.php

<?php

namespace pdladm;

use Illuminate\Database\Eloquent\Model;
use pdladm\Cliente;

class Projeto extends Model
{    
    public $timestamps = false;

    protected $fillable = array('cliente_id', 'nome', 'responsavel', 'prazo', 'criado', 'obs', 'status');

    public function cliente(){
        return $this->belongsTo('pdladm\Cliente');
    }

}

Cliente.php

<?php

namespace pdladm;

use Illuminate\Database\Eloquent\Model;

use pdladm\Projeto;

class Cliente extends Model
{
    public $timestamps = false;

    protected $fillable = array('nome', 'razao_social', 'nome_fantasia', 'atendido_por', 'inscricao_m', 'inscricao_e', 'endereco', 'cep', 'cidade', 'uf', 'cnpj', 'telefone', 'email', 'site', 'twitter', 'facabook', 'instagram', 'linkedin', 'responsavel', 'cargo', 'telefone_r', 'email_r', 'responsavel2', 'cargo2', 'telefone_r2', 'email_r2', 'criacado', 'atualizado', 'tipo','status','obs');

    public function projetos(){
        return $this->hasMany('pdladm/Projeto');
    }
}

Exibindo dentro do foreach em projeto.blade.php:

<td >Cliente: <a href="cliente/detalhes/{{@$p->cliente_id}}">{{@$p->cliente->nome}}</a></td>
16 respostas

Oi Fábio, tudo bem? posta aqui o controller responsável por exibir essa view?

<?php

namespace pdladm\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use pdladm\Projeto;
use pdladm\Etapa;
use pdladm\Cliente;


class ProjetoController extends Controller
{
    public function lista(){
        $projetos = Projeto::all();

        return view('projetos/projetos')->with('projetos', $projetos);
    }

O id do cliente no link está sendo exibido corretamente?

Sim, se coloco pra exibir o id ele aparece corretamente.

O ID do cliente só é exibido por que ele está presente no objeto produto. Experimente fazer:

{{$p->cliente->id}}

se o nome do produto não é exibido, o id também deve para de funcionar dessa forma. O problema acredito que seja o Lazy Load do Laravel e isso vai afetar a performance da sua aplicação de certa forma.

Experimente no controller, carregar os projetos juntamente com os dados dos clientes dessa forma:

$projetos = Projeto::with('cliente')->get();

Resolve?

Eu disse que se eu joga só o id do cliente, vindo do próprio projeto, ele é exibido. Desta forma: {{$p->cliente_id}}

A minha dúvida foi só ora garantir que o Produto estaba preenchido.

Testa o código do Wanderson, que no momento de buscar os produtos, ele já vai trazer e associar os clientes .

Se eu fiz certo, também não funcionou.

class ProjetoController extends Controller
{
    public function lista(){
        //$projetos = Projeto::all();

        $projetos = Projeto::with('cliente')->get();

        return view('projetos/projetos')->with('projetos', $projetos);
    }

É estranho que o código inicial que usei foi todo baseado no exemplo da aula, que eu também fiz aqui e funcionou. Não consigo achar uma diferença que justifique.

Será que é algum problema com alguma configuração do laravel? Eu tentei algumas coisas com um Etapas::where que também não funcionou, mas se eu uso DB::select('select * from etapas where... funciona.

tenta dar um dd() no resultado dessa querie pra ver se os resultados estão sendo retornados direitinho, por que pode ser que na view o acesso possa ser diferente.

Outra coisa, que versão do Laravel você está usando?

 1 => Projeto {#256 ▼
      +timestamps: false
      #fillable: array:7 [▼
        0 => "cliente_id"
        1 => "nome"
        2 => "responsavel"
        3 => "prazo"
        4 => "criado"
        5 => "obs"
        6 => "status"
      ]
      #connection: null
      #table: null
      #primaryKey: "id"
      #keyType: "int"
      #perPage: 15
      +incrementing: true
      #attributes: array:8 [▼
        "id" => 2
        "cliente_id" => 18
        "nome" => "Implementações de ferramentas"
        "responsavel" => 1
        "prazo" => "2014-03-30"
        "criado" => "2014-03-10 18:34:43"
        "obs" => ""
        "status" => "Concluído"
      ]
      #original: array:8 [▼
        "id" => 2
        "cliente_id" => 18
        "nome" => "Implementações de ferramentas"
        "responsavel" => 1
        "prazo" => "2014-03-30"
        "criado" => "2014-03-10 18:34:43"
        "obs" => ""
        "status" => "Concluído"
      ]
      #relations: []
      #hidden: []
      #visible: []
      #appends: []
      #guarded: array:1 [▼
        0 => "*"
      ]
      #dates: []
      #dateFormat: null
      #casts: []
      #touches: []
      #observables: []
      #with: []
      +exists: true
      +wasRecentlyCreated: false
    }

Tentei usar esse código dentro do projeto da aula, onde tem um código de relacionamento praticamente igual e que funciona, mas o problema persiste.

Esqueci de dizer estou usando o Laravel 5.3

Estes exemplos que te passei deveriam funcionar, são do Laravel 5.3, muito estranho isso. Vou procurar no projeto deles no github se tem algum bug relacionado a isso, enquanto isso, tenta uma outra alternativa. Tenta fazer o seguinte:

$projetos = Projeto::all();
$projetos->load('cliente');

Pessoal eu fiquei fora um tempo, pois meu tive que fazer uma troca de PC.Revendo o tópico aqui, vi que eu cometi um erro nas minhas postagens: eu postei o método que exibe a lista de projetos e não o que exibe os detalhes de apenas 1.

O método "lista" também não está fazendo o relationship, mas eu postei a view que exibe apenas um projeto então o método correto seria:

public function detalhes($id){

$projeto = Projeto::find($id);

if(empty($projeto)) { return "Projeto não encontrado."; }

return view('projetos/projeto')->with('p', $projeto);

}

solução!

Puts! Era um erro infantil no banco de dados, o código estava certo!

Obrigado pela atenção e desculpem-me!