2017-01-20 13 views
0

В настоящее время я работаю на платформе для подержанных продуктов, и я работаю с laravel.фильтр foreach в проекте laravel

Я хочу отображать только те продукты, которые являются максимальными. В 10 км от текущего пользователя. Расположение пользователя и местоположение продукта хранятся в базе данных, и я вычисляю расстояние между ними в том же контроллере, который отправляет продукты в представление.

Теперь я задаюсь вопросом, могу ли я как-то отфильтровать свой 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 

ответ

0

Не самое оптимальное решение, но оно должно работать:

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, возьмите первые 5.

Конечно, лучший способ обрабатывать расчет расстояний на уровне БД

 Смежные вопросы

  • Нет связанных вопросов^_^