@bwrigley You either need to do the distance calculation (using the haversine formula) in the query, or sort your collection after retrieving your results:
$addresses = Address::all()->sortBy(function ($address) use ($latitude, $longitude) {
// Calculate and return distance here
});
You probably want to query addresses, group by user, and then grab the users from those results:
class Address extends Model
{
public function scopeOrderByDistanceFrom($query, $latitude, $longitude)
{
$latitude = (float) $latitude;
$longitude = (float) $longitude;
return $query->addSelect(DB::raw("(3959 * acos(cos(radians({$latitude})) * cos(radians(lat)) * cos(radians(lng) -
radians({$longitude})) + sin(radians({$latitude})) * sin(radians(lat)))) as distance"))
->having('distance', '<', 25);
}
}
$addresses = Address::orderByDistanceFrom($latitude, $longitude)
->groupBy('user_id')
->get();
// Return a collection of users, sorted by address distance
$users = $addresses->pluck('user');