我正在尝试将此SQL查询转换为雄辩的查询,但我在口才方面的经验和知识有点缺乏。我很想学习如何自己解决这个问题,但我尝试过的所有解决方案都失败了,而且我在生产环境中遇到了问题。
基本上我有一个收件箱系统,我将数据库中的所有邮件分组到发件人ID。我希望它按发送ID对其进行分组,并显示发件人的最新消息。
我设法让它只使用原始SQL。
SELECT * FROM `messages` WHERE id IN(
SELECT MAX(id)
FROM `messages`
WHERE `recieveid` = 1
GROUP BY `sendid`
) ORDER BY `created_at` DESC
但是我不确定如何使用模型将其变成雄辩的声明。我目前正在使用这样简单的东西,但是它没有按时间排序,所以它可能会遗漏一些消息。
$getMessages = \App\Message::where("recieveid", Auth::user()->id)-
>orderBy("id","desc")->groupBy("sendid")->get(10);
答案 0 :(得分:1)
希望这对你有所帮助!
// SELECT * FROM `messages` WHERE id IN ...
$sql = Message::whereIn('id', function ($query) {
// SELECT MAX(id)
return $query->select(DB::raw('max(id)'))
// FROM `messages`
->from(with(new Message)->getTable())
// WHERE `recieveid` = 1
->where('recieveid', 1)
// GROUP BY `sendid`
->groupBy('sendid');
})
// ORDER BY `created_at` DESC
->orderBy('created_at', 'desc');