如何将复杂的代码顺序放入模型中?

Posted

技术标签:

【中文标题】如何将复杂的代码顺序放入模型中?【英文标题】:How do I put complex order by code into the model? 【发布时间】:2017-01-15 12:33:24 【问题描述】:

我需要按相关性对数据库对象进行排序。相关性是这样的:rating / distance(lat0, lng0, lat, lng)。我可能可以在控制器中这样做:

MyModel::orderBy('rating / FUNC(:lat0, :lng0, lat, lng)', [$lat, $lng])

但首先,还有另一个论点,因为纬度在公式​​中出现了两次:

MyModel::orderBy('rating / FUNC(:lat0, :lng0, lat, lng)', [$lat, $lat, $lng])

其次,将它放在控制器中听起来不太好。我想做的:

MyModel::orderByRelevance($lat, $lng)

所以,我的想法是将sql公式提取到辅助函数sql_distance_to($lat_col_name, $lng_col_name)中。然后,再添加一个助手:sql_distance_to_args($lat, $lng),它返回 [$lat, $lat, $lng]。并在模型中使用这两个来使最后一个语句成为可能。你说什么?我该怎么做?

【问题讨论】:

【参考方案1】:

您可以通过在模型中定义动态范围(参见Eloquent query scopes)来解决此问题,将逻辑保留在模型中并在整个应用程序中重复使用:

class MyModel extends Model 

    public function scopeRelevance($query, $lat, $lng)
    
        // Your relevancy calculation.

        // Return query builder instance.
        return $query->where('...');
    

并将其用作:

MyModel::relevance($lat, $lng)->get();

【讨论】:

以上是关于如何将复杂的代码顺序放入模型中?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据复杂数组[重复]

如何将unity模型导入android程序中

编程模式

如何将 MySQL 代码放入源代码管理中?

NetLogo-如何将平衡的化学方程式放入模型中?

如何将复杂的指针数据作为属性放入 qt 插件 xml 文件中