/** * Retorna uma Collection de perfils ordenados por numero de seguidores * @return Collection */ public static function getMaisSeguidos($entidadeAtiva) { $maisSeguidosByPerfils = DB::select(' SELECT perfil_seguido_id, COUNT(perfil_seguido_id) AS quantidade FROM perfil_follow_perfil GROUP BY perfil_seguido_id ORDER BY quantidade DESC LIMIT 30 '); $maisSeguidosByOngs = DB::select(' SELECT perfil_seguido_id, COUNT(perfil_seguido_id) AS quantidade FROM ong_follow_perfil GROUP BY perfil_seguido_id ORDER BY quantidade DESC LIMIT 30 '); $maisSeguidosByEmpresas = DB::select(' SELECT perfil_seguido_id, COUNT(perfil_seguido_id) AS quantidade FROM empresa_follow_perfil GROUP BY perfil_seguido_id ORDER BY quantidade DESC LIMIT 30 '); //Collections contendo objetos com perfil_seguido_id e quantidade $colPerfils = Collection::make($maisSeguidosByPerfils); $colOngs = Collection::make($maisSeguidosByOngs); $colEmpresas = Collection::make($maisSeguidosByEmpresas); // arrays contendo os ids dos perfils com mais seguidores $listaPerfils = $colPerfils->lists('perfil_seguido_id'); $listaOngs = $colOngs->lists('perfil_seguido_id'); $listaEmpresas = $colEmpresas->lists('perfil_seguido_id'); //Juntando os ids em um unico array e eliminando ids duplicados $listaTodos = array_merge(array_merge($listaPerfils, $listaOngs), $listaEmpresas); $listaIds = array_unique($listaTodos); $listaIdSeguidos = Collection::make($entidadeAtiva->following); if (count($listaIdSeguidos)) { //pegando lista de ids para fazer diff e nao recomendar ids que eu ja sigo $listaIdSeguidos = $listaIdSeguidos->lists('id'); $listaIdSeguidos[] = $entidadeAtiva->id; //fazendo diff dos ids que ja sigo $listaIds = array_diff($listaIds, $listaIdSeguidos); } //Pegando collection de Perfils com todos os perfils mais seguidos $colSugestoes = Perfil::whereIn('id', $listaIds)->get(); //Iterando sob o array de ids de perfils mais seguidos foreach ($listaIds as $id) { $totalSeguidores = 0; //Pegando objetos com campo quantidade de seguidores $obj1 = $colPerfils->keyBy('perfil_seguido_id')->get($id); $obj2 = $colOngs->keyBy('perfil_seguido_id')->get($id); $obj3 = $colEmpresas->keyBy('perfil_seguido_id')->get($id); //Testando se esses perfils tem seguidores dos tipos Perfil,Ong.Empresa if ($obj1) { $totalSeguidores += $obj1->quantidade; } if ($obj2) { $totalSeguidores += $obj2->quantidade; } if ($obj3) { $totalSeguidores += $obj3->quantidade; } //Adicionando numeroTotal de seguidores ao perfil com $id $perfil = $colSugestoes->find($id); if ($perfil) { $perfil->quantidadeSeguidores = $totalSeguidores; } } $colSugestoes = $colSugestoes->sortBy(function ($item) { return $item->quantidadeSeguidores; })->reverse(); return $colSugestoes; }