/** * 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; }