I have run into a problem when developing this.
I have this scope function implemented that I run on the model like
Listing::closest($lat, $lng)->paginate(5);
public function scopeClosest($query, $lat, $lng, $distance = 0, $units = 'km')
{
switch ( $units ) {
case 'miles':
//radius of the great circle in miles
$gr_circle_radius = 3959;
break;
case 'km':
//radius of the great circle in kilometers
$gr_circle_radius = 6371;
break;
}
return $query->selectRaw(
'*, ( '.$gr_circle_radius.' * acos( cos( radians('.$lat.') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('.$lng.') ) + sin( radians('.$lat.') ) * sin( radians( lat ) ) ) ) AS distance'
)->havingRaw("distance < ?", [10] );
}
However I run into this error that I do not now how to fix
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'distance' in 'having clause' (SQL: select count(*) as aggregate from
listings
having distance < 10)
It seems that laravel is running 2 queries, this is how it looks if I do not use havingRaw()
array:2 [▼
0 => array:3 [▼
"query" => "select count(*) as aggregate from `listings`"
"bindings" => []
"time" => 0.48
]
1 => array:3 [▼
"query" => "select *, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance from `listings` limit 5 offset 0"
"bindings" => []
"time" => 0.97
]
]
When I use havingRaw it seems laravel applies it to the first query and ofcourse it will fail. But why does it apply it to the first query and not the second one?