2015-02-09 28 views
0

我把這個子查詢轉換成laravel的時間很糟糕。有人可以幫助我這個轉換長的查詢如何將這個查詢轉換成laravel

SELECT 
    rescue_units.id as 'rescue_units_id', 
    name, 
    address, 
    lat, 
    lng, 
    email, 
    type, 
    status, 
    (6371 * acos(cos(radians(10.3099568)) * cos(radians(lat)) * cos(radians(lng) - radians(123.8934193)) + sin(radians(10.3099568)) * sin(radians(lat)))) AS distance 
FROM rescue_units 
WHERE rescue_units.id = ANY (
    SELECT ru_id 
    FROM ru_ec 
    WHERE ec_id = (
     SELECT id 
     FROM emergency_codes 
     WHERE ID = 6 
    ) 
) 
AND 
status = 1 
order by distance 

編輯: 這是我到目前爲止已經試過。

$markersByRadius = RescueUnit::select(
       DB::raw("rescue_units.id as 'rescue_units_id', name, address, lat, lng, email, type, status, 
        (6371 * acos(cos(radians(?)) * cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) * sin(radians(lat)))) AS distance 
        FROM rescue_units WHERE rescue_units.id = ANY (SELECT ru_id FROM ru_ec WHERE ec_id = (SELECT id FROM emergency_codes WHERE ID = ?)) AND status = 1 order by distance")) 
       ->take($limit) 
       ->setBindings([$lat, $lng, $lat, $ec_id]) 
       ->get(); 

     return $markersByRadius; 

這是錯誤:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE rescue_units.id = ANY (SELECT ru_id FROM ru_ec WHERE ec_id = (SELECT id FR' at line 3 (SQL: select rescue_units.id as 'rescue_units_id', name, address, lat, lng, email, type, status, (6371 * acos(cos(radians(10.3099568)) * cos(radians(lat)) * cos(radians(lng) - radians(123.8934193)) + sin(radians(10.3099568)) * sin(radians(lat)))) AS distance WHERE rescue_units.id = ANY (SELECT ru_id FROM ru_ec WHERE ec_id = (SELECT id FROM emergency_codes WHERE ID = 6)) AND status = 1 from `rescue_units` order by `distance` asc limit 3) 
+0

請發表您迄今嘗試過的內容。 – 2015-02-09 11:52:36

+0

@JoelHinz在這裏請檢查編輯... – user352156 2015-02-09 11:57:13

+0

什麼是行不通的,有什麼錯誤? – Matheno 2015-02-09 11:57:22

回答

0

請檢查這還沒有測試,但它應該工作。 只有你做錯的部分是sub query

$markersByRadius = RescueUnit::select(
       DB::raw("rescue_units.id as 'rescue_units_id', name, address, lat, lng, email, type, status, 
        (6371 * acos(cos(radians(?)) * cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) * sin(radians(lat)))) AS distance")) 
        ->where('rescue_units.id', function($query) 
          { 
           $query->select(DB::raw('ru_id')) 
             ->from('ru_ec') 
             ->where('ru_ec.ec_id', function($query) 
          { 
           $query->select(DB::raw('id')) 
             ->from('emergency_codes') 
             ->where('ID = ?') 
             ->where('status','1') 
             ->orderBy('distance', 'ASC'); 
          })); 
          }) 

       ->take($limit) 
       ->setBindings([$lat, $lng, $lat, $ec_id]) 
       ->get(); 
相關問題