Laravel块过滤器集合

时间:2020-02-18 21:21:09

标签: laravel

实际上我有一个简单的集合,但是我需要对此集合做一个过滤器,并且过滤器调用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;
    }

0 个答案:

没有答案