Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!