【问题标题】:Laravel count, groupBy and orderBy not working properlyLaravel 计数、groupBy 和 orderBy 无法正常工作
【发布时间】:2021-04-10 20:55:15
【问题描述】:

这是我的表的结构 [1]:https://i.stack.imgur.com/lmgtJ.png

用户表

id name
1 abid

消息表

id user_id to_user content read
1 2 1 message 0

我想为 User1 向您发送消息 (24) 等用户显示通知,这里 24 是 user1 的未读消息总数。

问题:通知必须按此顺序显示。最近发送消息的用户将首先显示。这正是我必须面对的问题。

输出示例:像安卓应用WhatsApp在聊天区显示消息。

注意:消息表中还添加了读取列类型布尔值。

注意:在此应用程序中,只有用户和管理员才能互相聊天。

寻找能给我结果的优雅的 Laravel 8 查询。

【问题讨论】:

  • 欢迎您!请显示您的代码和您尝试过的内容。屏幕截图也不受欢迎。
  • 谢谢。我已经发布了代码作为答案,请检查它。

标签: laravel eloquent laravel-query-builder read-unread


【解决方案1】:
$message = DB::table('message')->select('message.user_id');

/* join */
$message = $message->join('user', 'message.to_user', '=', 'user.id');    

/* select statements */
$message = $message->addSelect('message.to_user');
$message = $message->addSelect(DB::raw('COUNT(*) AS total_messages'));

$message = $message->groupBy('message.user_id', 'message.to_user');
$message = $message->get();

这应该计算用户向其他用户发送了多少条消息。

演示:SQL Fiddle

【讨论】:

  • 我稍微修改了您的查询。
  • 我在下一个答案发帖请检查并给我建议。
  • 您需要通过DESC方式订购,默认使用ASC方式订购。
  • 这应该可以工作:$result = $message->orderBy('messages.created_at', 'DESC')->get();
  • 非常感谢,亲爱的。我找到了解决方案。我将其发布为答案。
【解决方案2】:

解决方案。

最后,我通过查看这些链接找到了解决方案,我想通过提供指向他们答案的链接来感谢那些人。

  1. GroupBy after orderBy for complicated query in Laravel

  2. Order By before Group By using Eloquent (Laravel)

  3. SQL select only rows with max value on a column

这是最终代码

$result= Message::with('users')
         ->select(DB::raw('id,from_user,to_user,created_at, max(created_at) as createdAt'))
         ->where('to_user',$user)
         ->orderBy('createdAt', 'desc')
         ->groupBy('from_user')
         ->selectRaw('count(messages.from_user) as total_msg')
         ->get();

这是最终结果

Final Output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2019-06-04
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多