使用QueryBuilder

时间:2016-01-13 18:13:05

标签: mysql laravel group-by laravel-5 eloquent

我正在制作一本销售书籍的应用程序,但我正在努力解决这一部分问题。

当用户想要购买书籍时,他可以向该书的卖家发送消息。我有一个名为conversations的表和另一个名为messages的表,它保存了一个会话消息。

我有一个页面,用户可以在其中查看他所涉及的对话列表。应首先显示与最新消息的对话。我已经解决了这个问题,但我也希望在每个对话旁边显示未读消息的数量(消息有一个“读取”布尔字段)。我无法将计数添加为原始查询的一部分;我知道我可以对会话集合中的每个项目进行查询,但这样做效率很低。

到目前为止,这是我对QueryBuilder的查询:

$conversations = DB::table('conversations')
            ->select([
                'books.title as bookTitle', 'conversations.id',
                 DB::raw('max(messages.created_at) as lastMessage'),
                // DB::raw('(select count(id) from messages')
            ])
            ->where('conversations.from_user', $this->user->id)
            ->orWhere('conversations.to_user', $this->user->id)
            ->join('books', 'conversations.book_id', '=', 'books.id')
            ->join('messages', 'conversations.id', '=', 'messages.conversation_id')
            ->groupBy('messages.conversation_id')
            ->orderBy('lastMessage', 'DESC')
            ->get();

如果我添加注释掉的部分以尝试获取包含该对话的未读消息数的字段,则会出现SQL语法错误。我一直在想是否可能无法添加计数字段,因为它可能是我原始查询所独有的:我将所有消息(已读或未读)的对话排序并为每个对话选择最新消息;我要添加的计数字段应该只计算未读消息。

有什么想法吗?希望我解释自己。

感谢。

1 个答案:

答案 0 :(得分:0)

似乎而不是:

DB::raw('(select count(id) from messages')

你应该简单地使用:

DB::raw('(select count(id) from messages) as messageCount')

你在这里失踪)