【问题标题】:filter foreach in laravel project在 laravel 项目中过滤 foreach
【发布时间】:2017-01-20 19:24:31
【问题描述】:

目前我正在开发二手产品平台,并且正在使用 laravel。

我只想显示最大的产品。距离当前用户10km。 用户位置和产品位置存储在数据库中,我在将产品发送到视图的同一控制器中计算它们之间的距离。

现在我想知道我是否可以以某种方式过滤我在此控制器中计算的距离的 foreach,以便我可以过滤掉距离超过 10 公里的产品。

我觉得我的代码不是那么好,所以我愿意考虑其他选项来实现这一点。

控制器功能:

 public function getNearest()
    {
        $products= Product::orderBy('created_at','DESC')->paginate(5);

        foreach($products as $product) {

    //function that calculate distance
        $user = Auth::user();
        $address = $product->locatie;   //location of product
        $prepAddr = str_replace(' ','+',$address);
        $geocode=file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$prepAddr.'&sensor=false');
        $output= json_decode($geocode);
        $latitude = $output->results[0]->geometry->location->lat;
        $longitude = $output->results[0]->geometry->location->lng;

        $address2 = $user->locatie; //location current user
        $prepAddr2 = str_replace(' ','+',$address2);
        $geocode2=file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$prepAddr2.'&sensor=false');
        $output2= json_decode($geocode2);
        $latitude2 = $output2->results[0]->geometry->location->lat;
        $longitude2 = $output2->results[0]->geometry->location->lng;


        $coordinate1 = new Coordinate($latitude, $longitude); //location current user
        $coordinate2 = new Coordinate($latitude2, $longitude2); //location product

        $calculator = new Vincenty();
        $d = $calculator->getDistance($coordinate1, $coordinate2);
        $distance =$d/1000;

                $product->distance = round($distance);

        if($product->distance>10){
           //dont show product above 10km and filter foreach somehow?
        }
        }


        return view('welcome',compact('products'));
    }

查看:

@foreach ($products as $product)
    <div class="col-lg-3 margin-tb">
        <img src="/uploads/products/{{ $product->afbeelding }}">
        <p>{{ $product->name}}</p>
        <p>{{ $product->details}}</p>
        <p>{{ $product->price}}</p>
         <p>{{ $product->locatie}}</p>
        <p>{{ $product->distance}} km van jouw locatie</p>




        <a href="/Zoekertjes/{{ $product->id }}">bekijken</a>

    </div>
    @endforeach

【问题讨论】:

    标签: laravel foreach filter location distance


    【解决方案1】:

    不是最理想的解决方案,但应该可以:

    public function getNearest()
        {
            $products= Product::orderBy('created_at','DESC')->paginate(5);
            $user = Auth::user();
            $address2 = $user->locatie; //location current user
            $prepAddr2 = str_replace(' ','+',$address2);
            $geocode2=file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$prepAddr2.'&sensor=false');
            $output2= json_decode($geocode2);
            $latitude2 = $output2->results[0]->geometry->location->lat;
            $longitude2 = $output2->results[0]->geometry->location->lng;
            $coordinate2 = new Coordinate($latitude2, $longitude2); //location user
    
            $products->reject(function($product, $key) use($coordinate2) {
    
        //function that calculate distance
    
            $address = $product->locatie;   //location of product
            $prepAddr = str_replace(' ','+',$address);
            $geocode=file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$prepAddr.'&sensor=false');
            $output= json_decode($geocode);
            $latitude = $output->results[0]->geometry->location->lat;
            $longitude = $output->results[0]->geometry->location->lng;
    
            $coordinate1 = new Coordinate($latitude, $longitude); 
            //location product
    
            $calculator = new Vincenty();
            $d = round($calculator->getDistance($coordinate1, $coordinate2) / 1000);
    
            return $d > 10;
            });
    
    
            return view('welcome',compact('products'));
        }
    

    为什么我说它不是最佳的,是因为你不能保证收到 5 个结果(分页不起作用)。那是因为您在 php 级别而不是数据库级别具有距离逻辑。解决此问题的一种方法是计算产品数量,如果它们 5,则取前 5 个。

    当然,最好的方法是在 DB 级别处理距离计算

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 2021-09-11
      • 2021-07-09
      相关资源
      最近更新 更多