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