实际上我有一个简单的集合,但是我需要对此集合做一个过滤器,并且过滤器调用GoogleMaps来确定起点和终点之间的距离,问题是我有超过100行$ arbitres,而这部分过程变得非常非常非常漫长。
我如何才能获得更高的性能?
我想尝试一下但要尝试
方法newQuery不存在。
`
这里是我获取集合的方法:
$arbitres = Licencies::getArbitres($rencontre->dt_rencontre);
public static function getArbitres($date){
$licences = Licencies::whereIn('activite_licencie_id' , [24,25,50,80])
->where('valid_licence_id' , 3)
->where('saison_id' , self::getSaison()->id)
->where('dispo' , 1)
->whereHas('fonctions')
->whereHas('divisions')
->whereDoesntHave('rencontreOfficiels', function ($query) use ($date) {
$query->where('dt_rencontre', $date);
})->get();
return $licences;
}
在这里,我的进程变得太长了:(这样做是为了过滤距离最短的$ arbitres。
for($i=0; $i <= 1200 ; $i+=200){
$geo_filter = $arbitres->filter(function ($arbitre) use ($rencontre , $i) {
$origin = $arbitre->lb_adresse .' '. $arbitre->lb_ville_naissance .' '. $arbitre->cd_dept_naissance;
$destination = $rencontre->stade->adresse_stade .' '. $rencontre->stade->ville_stade .' '. $rencontre->stade->cd_post_stade;
$distance = getDistance($origin, $destination);
$distance = (float)$distance;
if($distance <= $i){
return true;
}
return false;
});
if ($geo_filter->isNotEmpty()) {
$arbitres = $geo_filter;
break;
}
}
函数getdistance:
function getDistance($origin, $destination){
$distance = 0;
$response = \GoogleMaps::load('directions')
->setParam([
'origin' => $origin,
'destination' => $destination,
'mode' => 'driving' ,
'language' => 'fr',
])->get();
$parsed_json = (json_decode($response));
if($parsed_json->status != "NOT_FOUND") {
$result = $parsed_json->{'routes'}[0]->{'legs'}[0]->{'distance'}->{'text'};
$a = $result;
$b = str_replace(" km",'',$a);
$distance = str_replace(",",'.',$b);
}
if(is_numeric($distance)){
$distance = $distance * 2;
}
return $distance;
}