使用eloquent获取表的最后25行

时间:2017-07-03 00:58:24

标签: php mysql laravel eloquent

我目前正在将我的网站转换为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本身可行,如果可能,我只需要帮助将其转换为雄辩。

2 个答案:

答案 0 :(得分: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 Raw查询:

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

答案 1 :(得分:0)

你应该尝试使用Eloquent查询:

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

注意:消息是型号名称。