Example #1
0
 /**
  * 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;
 }