Мне нужно заказать объекты базы данных по релевантности. Релевантность такова: 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]
. И используйте эти два в модели, чтобы сделать последнее утверждение возможным. Что ты говоришь? Как мне это сделать?