Laravel 5.4 - Show all phones of each result

1

I have the table convenios and telefones , each convenio has 1 or several telefones and a screen where all convenios are listed, I need to have all the phones related to each agreement.

I can not search the phones table in the same SQL that I bring the results of convenios , because since it can have more than telefone , it will multiply the results.

What would that select look like?

Model Phone

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Telefone extends Model
{
    protected $primaryKey = 'id';
    protected $table = 'telefones';
    protected $fillable = ['fone', 'id_medico'];
    public $timestamps = true;

    public function convenio()
    {
        return $this->belongsTo(Convenio::class, 'id_convenio', 'id');
    }
}

Model Convention

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Convenio extends Model
{
    protected $primaryKey = 'id';
    protected $table = 'convenios';
    protected $fillable = ['nome', 'descricao', 'id_cidade'];
    protected $dates = ['created_at', 'updated_at'];
    public $timestamps = true;

    public function telefones()
    {
        return $this->hasMany(Telefone::class, 'id_convenio', 'id');
    }

    public function endereco()
    {
        return $this->hasOne(Endereco::class, 'id_convenio','id');
    }

    public function convServ()
    {
        return $this->hasOne(ConvServ::class, 'id_convenio','id');
    }

    //Filtros de busca

    public function scopeCidade($convenios, $filtro)
    {
        if($filtro != 'all' && $filtro != '')
            return $convenios->where('id_cidade', $filtro);
    }

    public function scopeServico($convenios, $filtro)
    {
        if($filtro != 'all' && $filtro != '')
            return $convenios->where('id_servico', $filtro);
    }

    public function scopeEspecialidade($convenios, $filtro)
    {
        if($filtro != 'all' && $filtro != '')
            return $convenios->where('id_especialidade', $filtro);
    }

    public function scopeBuscar($convenios, $filtro)
    {
        if($filtro != '')
            return $convenios->where('nome', 'LIKE', '%' . $filtro . '%');
    }
}

Controller

public function busca(Request $request)
{
    $title = 'Busca';

    $cidades = Cidade::pluck('nomeCidade', 'id')->all();

    $servicos = Servico::pluck('nomeServ', 'id')->all();

    $convenios = Convenio::cidade($request->get('cidade'))
                        ->servico($request->get('servico'))
                        ->buscar($request->get('buscar'))
                        ->especialidade($request->get('especialidade'))
                        ->join("conv_servs", "convenios.id", "conv_servs.id_convenio")
                        ->join("especialidades", "especialidades.id", "conv_servs.id_especialidade")
                        ->join('cidades', 'cidades.id', 'convenios.id_cidade')
                        ->join('enderecos', 'enderecos.id_convenio', 'convenios.id')
                        ->select('cidades.nomeCidade', 'convenios.id', 'convenios.nome', 'especialidades.nomeEsp', 'enderecos.*')
                        ->orderby('nome', 'asc')
                        ->paginate(5);

    return view('site.busca', compact('title', 'convenios', 'cidades', 'servicos', 'fones'));
}

PS: ) These functions that appear in query ( city, specialty, .

    
asked by anonymous 15.07.2017 / 15:30

1 answer

1

Use the with method as follows:

public function busca(Request $request)
{
    $title = 'Busca';

    $cidades = Cidade::pluck('nomeCidade', 'id')->all();

    $servicos = Servico::pluck('nomeServ', 'id')->all();

    $convenios = Convenio::with('telefones')
                        ->cidade($request->get('cidade'))
                        ->servico($request->get('servico'))
                        ->buscar($request->get('buscar'))
                        ->especialidade($request->get('especialidade'))
                        ->join("conv_servs", "convenios.id", "conv_servs.id_convenio")
                        ->join("especialidades", "especialidades.id", "conv_servs.id_especialidade")
                        ->join('cidades', 'cidades.id', 'convenios.id_cidade')
                        ->join('enderecos', 'enderecos.id_convenio', 'convenios.id')
                        ->select('cidades.nomeCidade', 'convenios.id', 'convenios.nome', 'especialidades.nomeEsp', 'enderecos.*')
                        ->orderby('nome', 'asc')
                        ->paginate(5);

    return view('site.busca', compact('title', 
                'convenios', 
                'cidades', 
                'servicos', 
                'fones')
            );
}

where each% of found% is loaded into a list of convenio of telefones .

To display the data:

foreach($convenios as $convenio)
{
    $convenio-> ... campos
    foreach($convenio->telefones as $telefone)
    {
        $telefone-> ... campos
    }
}

15.07.2017 / 15:38