У меня есть функция, которая содержит запрос и вычисление процентиля (ниже) в результатах / коллекции запроса.
Эта функция необходима следующим образом:
У меня есть модель для спортсменов со многими испытаниями. У каждого теста также много результатов. Для каждого результата (отображается в таблице) мне нужно отобразить вычисляемый процентиль (который не сохраняется). Именно в этот момент (представление таблицы), где мне нужна функция для вычисления процентиля для каждого результата.
Я подробно описал здесь модели. Ответ этого сообщения также показывает используемый запрос.
Если я использую эту функцию в модели Result, это позволяет мне легко получить доступ к ней из представления таким образом {{$result->getThisRank($test->age, $an_athlete->gender, $result->battery_id, $result->score)}}
Если я поместил его в контроллер, мне понадобится динамический и сложный способ вызова маршрута для каждого конкретного результата в таблице. Даже не знаю, как это сделать.
Вопрос: Правильно ли иметь этот запрос и расчет в модели результатов?
Более ранняя почта здесь , похоже, также идет с моделью.
Расчет, выполненный по набору запросов:
for ($i = 1; $i < 100; $i++ ){ $rank = 0.0; $p = 0.0; $rank = $i/100 * ($count + 1); $p = $rank; //get integer and decimal for interpolation http://onlinestatbook.com/lms/introduction/percentiles.html $intpart = floor($p); $fraction = $p - $intpart; //dd($intpart . ' '.$fraction); if($fraction > 0){ //part of percentile formula - see article //test for min array index to not be out of bound. Test negative, most used case. if($intpart != 0){ $scoreLow = $all_scores[$intpart - 1]; if($intpart == $count){ //test for max array index to not go over bound $scoreHigh = $all_scores[$intpart - 1]; } else{ $scoreHigh = $all_scores[$intpart]; } } else{ $scoreLow = $all_scores[0]; $scoreHigh = $all_scores[$intpart]; } //scoreLow and scoreHigh has been determined, now final step for decimal rank $scoreHigh = $scoreHigh * 1.0; $scoreLow = $scoreLow * 1.0; $rank = ($fraction * ($scoreHigh - $scoreLow)) + $scoreLow; } else{ $rank = ($all_scores[$intpart - 1] * 1.0);//no decimal rank, plain rank calculation } if($sortorder == 'asc'){ $rankings[$i.'th %'] = $rank; }else{ $rankings[100 - $i.'th %'] = $rank; } //$rankings->add(['rank'.$i => $rank]); } //dd($rankings); //reverse rankings $rev_rankings = array_reverse($rankings); if ($battery == 111){ dd($rev_rankings); } $view_rank = null; foreach($rev_rankings as $key => $rank){ if($athlete_score == $rank){ $view_rank = $key; break; } if($athlete_score > $rank){ $view_rank = $key; break; } } return($view_rank); } else{ return ('Not available'); }