如何将复杂的代码顺序放入模型中?
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();
【讨论】:
以上是关于如何将复杂的代码顺序放入模型中?的主要内容,如果未能解决你的问题,请参考以下文章