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

Duvida sobre relacionamentos e colections

Boa tarde !

Estou praticando o aprendizado do curso reescrevendo um código que possuía em estilo procedural.

Tenho uma Model que possui um relacionamento hasMany com outra Model e preciso imprimir um atributo da Collection deste relacionamento. Como eu faço isso ?

Exemplo da Model :

<?php

/**
 * Created by Reliese Model.
 */

namespace App\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

/**
 * Class Cliente
 * 
 * @property int $clcod
 * @property string|null $clcpfcgc
 * @property Carbon|null $cldt_nascimento
 * @property string|null $clempresa
 * @property string|null $clprofissao
 * @property string|null $clestado_civil
 * @property string|null $clmae
 * @property string|null $clpai
 * @property string|null $clnaturalidade
 * @property string|null $clrg
 * @property Carbon|null $clrg_expedida
 * @property string|null $clrg_org_expedidor
 * @property Carbon|null $cldt_cadastro
 * @property string|null $clnome
 * @property string|null $clobservacao
 * 
 * @property Collection|Audiencia[] $audiencias
 * @property Collection|ClienteEmail[] $cliente_emails
 * @property Collection|ClienteEndereco[] $cliente_enderecos
 * @property Collection|ClienteTelefone[] $cliente_telefones
 * @property Collection|Processo[] $processos
 *
 * @package App\Models
 */
class Cliente extends Model
{
    protected $table = 'clientes';
    protected $primaryKey = 'clcod';
    public $timestamps = false;

    protected $dates = [
        'cldt_nascimento',
        'clrg_expedida',
        'cldt_cadastro'
    ];

    protected $fillable = [
        'clcpfcgc',
        'cldt_nascimento',
        'clempresa',
        'clprofissao',
        'clestado_civil',
        'clmae',
        'clpai',
        'clnaturalidade',
        'clrg',
        'clrg_expedida',
        'clrg_org_expedidor',
        'cldt_cadastro',
        'clnome',
        'clobservacao'
    ];

    public function audiencias()
    {
        return $this->hasMany(Audiencia::class, 'adproc_clcod');
    }

    public function cliente_emails()
    {
        return $this->hasMany(ClienteEmail::class, 'emclcod');
    }

    public function cliente_enderecos()
    {
        return $this->hasMany(ClienteEndereco::class, 'ceclcod');
    }

    public function cliente_telefones()
    {
        return $this->hasMany(ClienteTelefone::class, 'ctclcod');
    }

    public function processos()
    {
        return $this->hasMany(Processo::class, 'proc_clcod');
    }
}

Desta forma tentei acessar o atributo email da Model Clienteemail apartir do cliente da seguinte forma :

{{ $cliente->cliente_emails()->get('ememail')->first() }}

O resultado foi : {"ememail":"1234@terra.com.br"}

Como faria para exibir somente : 1234@terra.com.br ?

Entendo também que desta forma estou executando uma query certo ? Como faço para pegar direto o atributo desta Collection através deste relacionamento ?

Tentei :

$cliente->cliente_emails->ememail 

Porem ele retorna um erro dizendo que este atributo não existe nesta Collection

Quando imprimo só a Collection o resultado é o seguinte :

[{"emid":32,"ememail":"1234@terra.com.br","emclcod":3}]    

De antemão agradeço a ajuda.

3 respostas

Você vai precisar percorrer essa collection com um loop,Paulo. Não é um valor único.

Vinícius, obrigado. Mais cedo fiz isso. Contudo achava que pegando o First() que traz apenas um resultado.Daria para encadear e pegar o atributo e-mail. Na real ainda não entendi pq traz só o valor pq o resultado vem em uma linha só de quero.

solução!

Paulo, se você quer apenas o primeiro item da coleção, deve chamar o método first() nessa coleção, e não no atributo inexistente. :-)