如何通过代码将复杂的订单放入模型中?

时间:2016-09-07 17:48:42

标签: php sql laravel orm eloquent

我需要按相关性排序数据库对象。相关性是这样的: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 个答案:

答案 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();