2016-07-30 22 views
4

Das ist ziemlich kompliziert für mich. Ich habe eine Route, die eine Suche ist - das funktioniert ganz gut, außer dass ich nicht nach Postleitzahl suchen kann, um die Lat und eine bestimmte Postleitzahl zu finden. Das heißt, ich kann den Lat und Long ausarbeiten, aber ich bin mir nicht sicher, wie ich es in meine bestehende Abfrage integrieren soll. Diese Abfrage ist die Suchabfrage ohne PLZ:Get durch Breiten- und Längengrad in Laravel 5 mit anderen Joins

$query = DB::table('dogs'); 
$query->leftJoin('dog_addresses','dogs.id','=','dog_addresses.dog_id'); 
$query->leftJoin('dog_videos','dogs.id','=','dogs_videos.dog_id'); 
$query->leftJoin('dogs_breeds','dogs.breed_id','=','dogs_breeds.id'); 
if($request->input("breed") && $request->input("breed") != "" && $request->input("breed") != "any") 
    { 
     $breed = Dog_Breed::where("breed_name", $request->input("breed"))->first(); 
     $query->where('dogs.breed_id', $breed->id); 
    } 
$results = $query->get(); 

ich etwas zu der Abfrage hinzufügen, um die Breite und Länge der Postleitzahl zu erhalten:

if($request->input("postcode")) 
{ 
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_URL, "http://api.postcodes.io/postcodes/" . $request->input('postcode')); 
    $result = json_decode(curl_exec($curl)); 
    curl_close($curl); 
    $postcode_lat = $result->result->latitude; 
    $postcode_long = $result->result->longitude;    
} 

Dies lässt mich meine Postleitzahl Breitengrad und Länge erhalten . Aber ich weiß dann nicht, wie man die Hunde an Ort und Stelle erhält, basierend auf den Lat und langen Spalten, die in der Tabelle dog_addresses vorhanden sind, die mit dem Hundetisch verbunden ist. Wie mache ich das?

Also, wenn meine dog_addresses Tabelle die Spalten Lat und Long hat.

So Hunde:

id | user_id | dog_name | age 

dog_addresses:

id | dog_id | address_line_1 | town | postcode | lat | long 

Also für meine Frage muss ich alle Hunde bekommen, wo gezüchtet ID 1 ist, aber ich möchte innere Videos an, damit ich Erhalten Sie alle Videoinformationen und Adressinformationen, aber ich möchte auch die Reihenfolge der zurückgegebenen Hunde nach ihrer Nähe zu meiner eingegebenen Postleitzahl sortieren, basierend auf lat und long.

Ich bin sehr verwirrt. Ich fand das:

(3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance 

Aber ich bin immer noch nicht sicher, wie es zu integrieren, oder welchen Nutzen es für mich ist. Bitte helfen

+0

überprüfen Sie meine Antwort, wenn es für Sie funktioniert – jaysingkar

Antwort

4

Im Folgenden Code wäre in der Lage, die Ergebnisse in der Art und Weise abzurufen Sie wollten. Code-Erklärung in-line.

if($request->input("postcode")) 
{ 
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_URL, "http://api.postcodes.io/postcodes/" . $request->input('postcode')); 
    $result = json_decode(curl_exec($curl)); 
    curl_close($curl); 
    $postcode_lat = $result->result->latitude; 
    $postcode_long = $result->result->longitude; 

    $query = DB::table('dogs'); 
    //Join statement responsible for retieving dogs addresses based on latitude and longitude in address table. 
    $query->join(DB::raw('(SELECT dog_id, (
           3959 * acos (
           cos (radians($postcode_lat)) 
           * cos(radians(lat)) 
           * cos(radians(long) - radians($postcode_long)) 
           + sin (radians($postcode_lat)) 
           * sin(radians(lat)) 
          )  
        )AS distance from dog_addresses) as dog_addresses'), function ($join){ 
      $join->on('dogs.id', '=', 'dog_addresses.dog_id') 

     }); 
    $query->leftJoin('dog_videos','dogs.id','=','dogs_videos.dog_id'); 
    $query->leftJoin('dogs_breeds','dogs.breed_id','=','dogs_breeds.id'); 
    if($request->input("breed") && $request->input("breed") != "" && $request->input("breed") != "any") 
    { 
     $breed = Dog_Breed::where("breed_name", $request->input("breed"))->first(); 
     $query->where('dogs.breed_id', $breed->id); 
    } 
    $results = $query->orderBy('dog_addresses.distance', 'ASC') //Ordering the results in ascending order by calculated distance 
        ->limit(20) //Limiting the results to 20 . Can be changed or removed according to your needs 
        ->get(); //Retrieving the results 
} 
+0

Eigentlich bekomme ich den folgenden Fehler mit: Call to undefined Methode Illuminate \ Database \ Query \ JoinClause :: Select() - Es scheint, dass es nicht gefällt -> Wählen Sie hinzugefügt, um die $ Join -> weiter. Irgendwelche Ideen? –

+1

@DavidG wird eine überprüfen und Sie in 30 Minuten – jaysingkar

+0

@DavidG Bitte überprüfen Sie die Bearbeitung – jaysingkar

1

Sie können die GLength Funktion von MySQL versuchen:

SELECT 
    *, GLength(LineString(GeomFromText('POINT(latPosCode,lngPosCode)'),GeomFromText('POINT(latInDataBase,lngInDataBase)'),)) AS DISTANCE 
FROM dogs   
ORDER BY DISTANCE 
+0

Aber wie würde ich dann die anderen Tabellen beitreten? Wenn ich nichts dagegen habe, frage ich –