Easily add longitude and latitude columns to your records and use inherited functionality for calculating distances.
First either update your database or add this to a migration for each model:
$table->double('longitude');
$table->double('latitude');
Finally in your model use:
use Geographical;
Find the distance to all the entries in your table from a particular location.
$query = Model::distance($latitude, $longitude);
$asc = $query->orderBy('distance', 'ASC')->get();
Find all the entries in your table inside a circular geo-fence.
$query = Model::geofence($latitude, $longitude, $inner_radius, $outer_radius);
$all = $query->get();
The default unit of distance is miles. You can change it to kilometers by putting this in your model
protected static $kilometers = true;
- The method returns a
Eloquent\Builder
object so that you can add optional conditions if you want. - If you require to select only a certain columns, it can be achieved by using
select()
.(Model::select('id', 'name')->distance($latitude, $longitude);
select()
should precede thedistance()/geofence()
) - You can use
distance
as an aggregate column in the result. (Aggregate columns cannot be used inWHERE
, useHAVING
to execute any condition.) - If you use different column names for latitude and longitude, mention them in the Model.php
const LATITUDE = 'lat'; const LONGITUDE = 'lng';
PHP 5.6.4+ and Laravel 5+ are required.
To get the latest version of Laravel Geographical, simply require the project using Composer:
$ composer require malhal/laravel-geographical