Laravel 函数属于模型或控制器

Posted

技术标签:

【中文标题】Laravel 函数属于模型或控制器【英文标题】:Laravel function belong in model or controller 【发布时间】:2017-03-18 19:38:03 【问题描述】:

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

以下方式需要这个函数:

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

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

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

如果我把它放在控制器中,我需要一些动态和复杂的方式来为表中的每个特定结果调用路由。甚至不知道如何做到这一点。

问题:在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】:

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

【讨论】:

这是一个返回的字符串,例如'30th %',所以'不可用'应该没问题。但类型是有道理的。谢谢!

以上是关于Laravel 函数属于模型或控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何根据用户在 Laravel 5 中的角色选择用户?

Laravel - 在控制器或模型中构建查询?对于大型网络应用

在 Laravel 中,直接从视图向模型或控制器请求一些数据的最佳方式是啥?

添加/编辑模型的代码属于哪里?模型或控制器

雄辩的 ORM 控制器或模型

向 Laravel 模型查询添加计算字段