我目前正在将我的网站转换为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 :(得分: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();
注意:消息是型号名称。