我需要按相关性排序数据库对象。相关性是这样的: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]
。并在模型中使用这两个来使最后一个语句成为可能。你说什么?我该怎么做?
答案 0 :(得分: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();