2017-05-13 17 views
0

我想要做的事情很簡單: - 當根據用戶緯度和經度(在DB上)計算的距離高於int時,我們通過添加刪除結果當前用戶那裏 - 當這種距離不高,我們的自定義值添加到返回的結果使用Laravel QueryBuilder「when」並將自定義值添加到查詢結果

這可以很容易地使用foreach後執行查詢完成:

foreach($search as $key => $value){ 
      if(distance($value->latitude,$value->longitude,$user->latitude,$user->longitude,"K") > $distance) { 
       unset($search[$key]); 
      } else { 
      $search[$key]->distance = $calculatedDistance 
     } 
     } 

這種方式的缺點是,如果我們有一個大型的數據庫,它會消耗大量的內存ory和時間,因爲我們應該直接在查詢中做兩次。

我需要做的是使這個查詢本身執行它。我不知道該怎麼做的是: - 在執行查詢時直接向查詢添加一個自定義值,並在查詢中的某個時間內執行距離計算,而不使用foreach,而是直接獲取當前原始值與...比較。

我現在正在做什麼:

->when($distance > 0, function ($query) use($distance, $longitude, $latitude){ 
        $query->where(function ($subQuery) use ($longitude, $latitude,$distance) { 
         $cDistance = distance((int)$subQuery->value('latitude'), 
          (int)$subQuery->value('longitude'), 
          $latitude, 
          $longitude, 
          "K"); 
         $subQuery->when(($cDistance > $distance), 
          function ($subQuery){ 
           $subQuery->where('users.id', '<>', (int)$subQuery->value('id')); 
          },function ($subQuery) use ($cDistance) { 
           $subQuery->value((string)$cDistance.' as distance'); 
          } 
         ); 
        }); 

$subQuery->value('something')僅與查詢的前原測試,而不是做這行的所有行。 $subQuery->value((string)$cDistance.' as distance');返回錯誤

SQLSTATE [42S22]:柱未找到:1054未知列 '84 0.354917445764' 在 '字段列表'(SQL:選擇84354917445764作爲 distanceusers極限1)

+0

** - > value($ column_name)**只是帶上** $ column_name **的值。粘貼方法內容試試幫你 – MohamedSabil83

+0

哪個方法的內容?我需要的是簡單地向查詢結果添加一個值,例如$ user = [username => myname]我需要添加5的年齡,以便結果變爲$ user = [username => myname,age = 5] –

+0

我知道。通過該方法開始' - > when()'功能 – MohamedSabil83

回答

0
$sqlDistance = DB::raw('ROUND (6371 * acos(cos(radians(' . $latitude . ')) 
          * cos(radians(doctor_profile.latitude)) 
          * cos(radians(doctor_profile.longitude) 
          - radians(' . $longitude . ')) 
          + sin(radians(' . $latitude . ')) 
          * sin(radians(doctor_profile.latitude))))'); 

查詢內部:

->selectRaw("{$sqlDistance} AS distance") 
      ->when($distance > 0, function ($query) use ($distance,$sqlDistance){ 
        $query->havingRaw('{$sqlDistance} <= ?', [$distance]); 
       }) 
相關問題