У меня есть одна область действия на одной из моих Location
моделей.В моем случае Shop
имеет отношение one to many
с Locations
.Location
имеет широту и долготу.$latitude, $longitude, $radius
приходят из поля поиска.Я пытаюсь заказать Shop
на расстоянии Location
от пользователя, который ищет.
public function scopeCloseTo($query, $latitude, $longitude, $radius = 25)
{
$haversine = "(3959 * acos(cos(radians($latitude))
* cos(radians(latitude))
* cos(radians(longitude)
- radians($longitude))
+ sin(radians($latitude))
* sin(radians(latitude))))";
return $query
->select('*')
->selectRaw("{$haversine} AS distance")
->whereRaw("{$haversine} < ?", [$radius]);
}
, и я использую его так
return Shop::with(['locations' => function ($query) use ($latitude, $longitude, $radius) {
$query->closeTo($latitude, $longitude, $radius);
}])->whereHas('locations', function ($query) use ($latitude, $longitude, $radius) {
$query->closeTo($latitude, $longitude, $radius);
});
И это работаетхорошо, это позволяет мне найти все магазины в пределах определенного радиуса.
То, что я хочу сделать, это затем заказать Shops
по расстоянию.
Добавление orderBy
к closeTo
в замыкании просто заказывает locations
.Вы не можете заказать по Distance
на Shop
, так как он не существует.Как мне обойти это?