Ejemplo n.º 1
0
 /**
  * Retorna sugestoes de perfils que já oa entidadeAtiva ja nao esteja seguindo.
  * @param  Perfil|Ong|Empresa  		$entidadeAtiva
  * @param  integer 					$minSugestoes
  * @param  integer 					$maxSugestoes
  * @return Collection  Collection de perfils para sugestao
  */
 public static function getSugestoes($entidadeAtiva, $minSugestoes = 3, $maxSugestoes = 3)
 {
     //Obtendo um array de Collections de Perfils que tem interesses em comum
     $arrayCollectionPerfil = $entidadeAtiva->interesses()->with('perfil')->get()->lists('perfil');
     //Obtendo um array de ids dos perfils que já sigo
     $notAllowed_ids = $entidadeAtiva->followPerfil()->lists('id');
     //Adicionando o meu $perfil->id para a lista de ids nao permitidos
     //fix adicionando id do perfil associado a conta dessa entidadeAtiva
     array_push($notAllowed_ids, $entidadeAtiva->user->perfil->id);
     $sugestoes = Collection::make();
     //Iterando sob o array de collections e mergeando as collections em uma collection final
     //TODO: melhorar isso Collection::flat?
     foreach ($arrayCollectionPerfil as $key => $collection) {
         //Se for primeira iteração...
         if ($sugestoes->isEmpty()) {
             $sugestoes = $collection;
         } else {
             $sugestoes = $sugestoes->merge($collection);
         }
     }
     //pegando lista de ids de perfils com interesses em comum
     $arraySugestoes = $sugestoes->lists('id');
     //Removendo lista de ids nao permitidos da lista de sugestoes
     $arrayFinal = array_diff($arraySugestoes, $notAllowed_ids);
     $totalSugestoes = count($arrayFinal);
     //Criando uma Collection $extra, que ira conter sugestoes extras caso numero de
     //sugestoes insuficiente
     $extras = Collection::make();
     if ($totalSugestoes < $minSugestoes) {
         $diferenca = $minSugestoes - $totalSugestoes;
         //Obtendo lista de ids que nao quero, (todos que ja me sugeriram + todos que nao posso seguir)
         $merged = array_merge_recursive($notAllowed_ids, $arraySugestoes);
         $notAllowed_ids = array_unique($merged);
         //Pegando perfils extras para sugerir..
         $extras = Perfil::whereNotIn('id', $notAllowed_ids)->limit($diferenca)->get();
     }
     //Pegando Collection de perfils para retornar
     $sugestaoFinal = Perfil::whereIn('id', $arrayFinal)->get()->merge($extras);
     //Limitando o total de elementos ao valor de $maxSugestoes ou o total da query
     $qnt = count($sugestaoFinal);
     $max = $qnt < $maxSugestoes ? $qnt : $maxSugestoes;
     //Se tiver apenas 1 elemento, nao aplicar random(), pois perco a collection externa
     $sugestaoFinal = $qnt == 1 ? $sugestaoFinal : $sugestaoFinal->random($max);
     return $sugestaoFinal;
 }