2017-10-17 2 views
0

Ich habe 5550 Datensätze von verschiedenen Routen und ich muss eine foreach-Schleife für jeden Datensatz und erhalten Sie die API-Daten. Also habe ich eine Funktion mit Guzzle in Laravel:Ich muss die Entfernungsdaten von Google Maps laden und speichern sie in meiner Datenbank

public function getDirectionDistance($origins, $distinations) 
{ 
    $client = new Client(); 
    $res = $client->get("https://maps.googleapis.com/maps/api/distancematrix/json?origins=$origins&destinations=$distinations&key=ччч")->getBody()->getContents(); 
    $obj = json_decode($res, true); 
    $distance = $obj['rows'][0]['elements'][0]['distance']['text']; 
    $clean = $string = str_replace(' km', '', $distance); 
    return $clean; 

} 

ich es in einem Geschäft Methode

public function store() 
{ 
    $route = $this->route->with('from','to')->get(); 
    $maps = new Maps(); 

    foreach ($route as $item){ 

     $direction = new Direction(); 
     $from = $item->from->name; 
     $to = $item->to->name; 
     $direction->route_id = $item->id; 
     $direction->distance = $maps->getMapsApi("$from,israel","$to,israel"); 
     $direction->save(); 
     sleep(3); 

    } 

} 

aber wenn ich es tun, bekomme ich 1 Entfernung für 200 Routen und dann nach 200 Reihe Ich bekomme die nächste Strecke für die nächste Route. So stoppen Sie und warten Sie, bis API abgeschlossen ist, speichern Sie sie und starten Sie die nächste Zeile. Ich brauche die Daten, um einen Machine Learning-Preisrechner zu erstellen.

+0

Was möchten Sie tun? Möchten Sie alle 5500 Datensätze als einmal speichern? – Vikash

+0

Ja, ich möchte die Entfernung mit der route_id speichern und eine Relation für die Route erstellen. –

+0

Sie können Daten in Chunck teilen und speichern Sie alle Daten auf einmal, es wird in kleinen Chunck teilen und speichern – Vikash

Antwort

0

Für mich auf diese Weise arbeiten: habe ich eine Funktion, die einen Anruf mit CURL Google:

public function calculateDistance($origins, $destination){ 
    $staticDistanceModel = New StaticDistance(); 
    $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" . $origins . "&destinations=" . $destination . "&mode=driving&language=it-IT&key=xyz"; 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, $url); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
      curl_setopt($ch, CURLOPT_PROXYPORT, 3128); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
      $response = curl_exec($ch); 
      curl_close($ch); 
      $response_a = json_decode($response, true); 
      if (isset($response_a['rows'][0]['elements'][0]['distance']['value'])) { 
       $m = $response_a['rows'][0]['elements'][0]['distance']['value']; 
      }else{ 
       $m = 0; 
      } 

      $staticDistanceModel->insertStatic($origins, $destination, $m); 
     } 
    } 

die Funktion in meinem Modell ist so etwas wie:

public function insertStatic($origins, $destination, $m){ 
     $arrayInsert = array('origins'=>$origins, 'destination'=>$destination,'distance'=>$m); 
     Self::create($arrayInsert); 
    } 

Und in Mein Controller habe ich forEach() wie folgt:

Aber sei vorsichtig, becau se google Limit-Anfrage, und die Zeit für 5500 Datensätze möglicherweise lang, so dass Sie Array chunk.

Hope this helfen Ihnen

Verwandte Themen