Laravel功能属于模型或控制器

时间:2017-03-18 19:38:03

标签: php laravel view model

我有一个函数,它在查询的结果/集合中包含查询和百分位计算(下面)。

以下列方式需要此功能:

我有一个运动员模型,有很多测试。每个测试也有很多结果。对于每个结果(显示在表格中),我需要显示计算的百分位数(未存储)。在这一点上(表格视图)我需要函数来计算每个结果的百分位数。

我详细介绍了模型here。该帖子的答案也显示了使用的查询。

如果我在结果模型中粘贴该功能,它允许我以这种方式从视图中轻松访问它{{$result->getThisRank($test->age, $an_athlete->gender, $result->battery_id, $result->score)}}

如果我将它放在Controller中,我需要一些动态且复杂的方法来为表中的每个特定Result调用路由。甚至不确定如何做到这一点。

问题:在结果模型中进行此查询和计算是否正确?

早期的帖子here似乎也适用于模特。

对查询集合执行的计算:

                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');
        }

1 个答案:

答案 0 :(得分:1)

您描述的计算类型当然属于域(即 - 模型)。根据您构建应用程序的方式,您可以将该功能放在现有的Eloquent模型中,或者甚至作为不扩展ORM的新实体的一部分。另外,我会标准化它提供的返回值的类型,可能将其限制为数值或可能的数值以及NULL。然后我会在视图(刀片模板)中替换任何NULL值等,其中&#34;不可用&#34;正如我在你的功能底部注意到的那样。