diff --git a/app/Http/Controllers/Admin/PlacesController.php b/app/Http/Controllers/Admin/PlacesController.php
index 2e655c42..47aed5f4 100644
--- a/app/Http/Controllers/Admin/PlacesController.php
+++ b/app/Http/Controllers/Admin/PlacesController.php
@@ -95,4 +95,55 @@ class PlacesController extends Controller
return redirect('/admin/places');
}
+
+ /**
+ * List the places we can merge with the current place.
+ *
+ * @param string Place id
+ * @return Illuminate\View\Factory view
+ */
+ public function mergeIndex($placeId)
+ {
+ $first = Place::find($placeId);
+ $results = Place::near(new Point($first->latitude, $first->longitude))->get();
+ $places = [];
+ foreach ($results as $place) {
+ if ($place->slug !== $first->slug) {
+ $places[] = $place;
+ }
+ }
+
+ return view('admin.places.merge.index', compact('first', 'places'));
+ }
+
+ public function mergeEdit($place1_id, $place2_id)
+ {
+ $place1 = Place::find($place1_id);
+ $place2 = Place::find($place2_id);
+
+ return view('admin.places.merge.edit', compact('place1', 'place2'));
+ }
+
+ public function mergeStore(Request $request)
+ {
+ $place1 = Place::find($request->input('place1'));
+ $place2 = Place::find($request->input('place2'));
+
+ if ($request->input('delete') === '1') {
+ foreach ($place1->notes as $note) {
+ $note->place()->dissociate();
+ $note->place()->associate($place2->id);
+ }
+ $place1->delete();
+ }
+ if ($request->input('delete') === '2') {
+ foreach ($place2->notes as $note) {
+ $note->place()->dissociate();
+ $note->place()->associate($place1->id);
+ }
+ $place2->delete();
+ }
+
+ return redirect('/admin/places');
+ }
}
diff --git a/app/Place.php b/app/Place.php
index 42ece165..75634337 100644
--- a/app/Place.php
+++ b/app/Place.php
@@ -4,6 +4,8 @@ namespace App;
use DB;
use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Builder;
+use Phaza\LaravelPostgis\Geometries\Point;
use MartinBean\Database\Eloquent\Sluggable;
use Phaza\LaravelPostgis\Eloquent\PostgisTrait;
@@ -45,33 +47,23 @@ class Place extends Model
}
/**
- * Get all places within a specified distance.
+ * Select places near a given location.
*
- * @param float latitude
- * @param float longitude
- * @param int maximum distance
- * @todo Check this shit.
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ * @param Point $point
+ * @param int Distance
+ * @return \Illuminate\Database\Eloquent\Builder
*/
- public static function near(float $lat, float $lng, int $distance)
+ public function scopeNear(Builder $query, Point $point, $distance = 100)
{
- $point = $lng . ' ' . $lat;
- $distace = $distance ?? 1000;
- $places = DB::select(DB::raw("select
- name,
- slug,
- ST_AsText(location) AS location,
- ST_Distance(
- ST_GeogFromText('SRID=4326;POINT($point)'),
- location
- ) AS distance
- from places
- where ST_DWithin(
- ST_GeogFromText('SRID=4326;POINT($point)'),
- location,
- $distance
- ) ORDER BY distance"));
+ $field = DB::raw(
+ sprintf("ST_Distance(%s.location, ST_GeogFromText('%s'))",
+ $this->getTable(),
+ $point->toWKT()
+ )
+ );
- return $places;
+ return $query->where($field, '<=', $distance)->orderBy($field);
}
/*
diff --git a/resources/views/admin/places/edit.blade.php b/resources/views/admin/places/edit.blade.php
index 3efae944..4c492593 100644
--- a/resources/views/admin/places/edit.blade.php
+++ b/resources/views/admin/places/edit.blade.php
@@ -119,6 +119,8 @@ Edit Place « Admin CP
+
+
When a place is deleted, it is removed from the database, and all the notes associated with it, will be re-associated with the other place.
++ | Place 1 | +Place 2 | +
---|---|---|
Name | +{{ $place1->name }} | +{{ $place2->name }} | +
Description | +{{ $place1->description }} | +{{ $place2->description }} | +
location | +{{ $place1->latitude }}, {{ $place1->longitude }} | +{{ $place2->latitude }}, {{ $place2->longitude }} | +
Foursquare | +{{ $place1->foursquare }} | +{{ $place2->foursquare }} | +
+ + |
We shall be merging {{ $first->name }}. It’s location is Point({{ $first->location }})
.