将SQL查询更改为雄辩的查询

时间:2018-06-16 20:30:28

标签: php mysql laravel eloquent

我正在尝试将此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);

1 个答案:

答案 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');