2016-09-07 3 views
0

Мне нужно заказать объекты базы данных по релевантности. Релевантность такова: 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(); 
Смежные вопросы