2017-07-03 164 views
2

獲取最後25行的表的我目前轉移我的網站laravel,我有打開下面的SQL進入雄辯問題:用雄辯

(SELECT * FROM `messages` WHERE `lobby`='$lobbyid' AND `timestamp` > '1' ORDER BY id DESC LIMIT 25) order by id' 

我曾嘗試:

return DB::table('messages') 
       ->select('*') 
       ->where('lobby', $lobbyid) 
       ->where('timestamp', '>', 1) 
       ->orderby('id', 'desc') 
       ->limit(25) 
       ->orderby('id') 
       ->get(); 

但第二個order by只是被忽略。如標題所示,此查詢旨在獲取特定大廳聊天的最後25條消息。 SQL本身的作品我只是需要幫助轉換成雄辯如果可能的話。

+0

您只能使用一個'order by'。在這種情況下,您只需要一個:第一個'order by'返回記錄的順序與第二個'order by'的順序相同 –

+1

這可能會變得很難看,因爲您可能需要在這裏使用原始子查詢。 –

+0

@NorbertvanNobelen正確,但第一部分'SELECT * FROM messages WHERE lobby ='$ lobbyid'AND timestamp>'1'ORDER BY id DESC LIMIT 25'實際上得到最後25條消息......問題在於更高的id首先出現。較高的ID應該是最後的,因爲它們是較新的消息。 – Shawn31313

回答

1

我認爲你需要從查詢25分的結果,然後在PHP重新排序陣列

$result = DB::table('messages') 
       ->select('*') 
       ->where('lobby', $lobbyid) 
       ->where('timestamp', '>', 1) 
       ->orderby('id', 'desc') 
       ->limit(25) 
       ->get(); 

重排陣:

$result= array_sort($result , 'id', SORT_ASC); 

function array_sort($array, $on, $order=SORT_ASC){ 

    $new_array = array(); 
    $sortable_array = array(); 

    if (count($array) > 0) { 
     foreach ($array as $k => $v) { 
      if (is_array($v)) { 
       foreach ($v as $k2 => $v2) { 
        if ($k2 == $on) { 
         $sortable_array[$k] = $v2; 
        } 
       } 
      } else { 
       $sortable_array[$k] = $v; 
      } 
     } 

     switch ($order) { 
      case SORT_ASC: 
       asort($sortable_array); 
       break; 
      case SORT_DESC: 
       arsort($sortable_array); 
       break; 
     } 

     foreach ($sortable_array as $k => $v) { 
      $new_array[$k] = $array[$k]; 
     } 
    } 

    return $new_array; 
} 

或者使用將使用Laravel原始查詢:

DB::raw((SELECT * FROM `messages` WHERE `lobby`='$lobbyid' AND `timestamp` > '1' ORDER BY id DESC LIMIT 25) order by id') 
0

您應該使用Eloquent查詢來嘗試此操作:

Message::where('lobby', $lobbyid) 
     ->where('timestamp', '>', 1) 
     ->orderBy('id', 'desc') 
     ->take(25) 
     ->get(); 

注意:消息是型號名稱。