如何使用laravel按查询连接2个表

时间:2018-01-31 08:21:15

标签: mysql laravel-5

我的数据库中有用户和聊天表。以下是我的表格中的一些示例数据:

用户表:

id  |   name  |    avatar
1       john     default.png
2       mark       picture.jpg

聊天表:

   id  |   user_id  |  friend_id | message | status
    1        1           2           hello     0
    2        1           2           hi        1

状态列的目的是确定消息是否已被读取。

  status 0 = unread message
  status 1 = read message

以下是我的代码,用于对所有未读消息进行分组和计数:

        $chat = DB::table('chats')
             ->join('users', 'users.id', '=', 'chats.user_id')
             ->select('user_id', DB::raw('count(*) as total'))
             ->where('friend_id', Auth::user()->id)
             ->where('status',0)
             ->groupBy('user_id')
             ->get();

这是我的代码,当我尝试插入用户头像但我收到此错误:users.avatar' isn't in GROUP BY

        $chat = DB::table('chats')
             ->join('users', 'users.id', '=', 'chats.user_id')
             ->select('users.avatar','user_id', DB::raw('count(*) as total'))
             ->where('admin_id', Auth::user()->id)
             ->where('status',2)
             ->groupBy('user_id')
             ->get();

我想要的是获取发送消息的用户的头像。我不知道如何构建我的查询来获取头像列。任何帮助,将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

如果您GROUP BYid users,您应该也可以选择users表格中的任何其他列:

$chat = DB::table('chats')
         ->join('users', 'users.id', '=', 'chats.user_id')
         ->select('users.id', 'users.avatar', DB::raw('COUNT(*) AS total'))
         ->where('friend_id', Auth::user()->id)
         ->where('status',0)
         ->groupBy('users.id')
         ->get();

在第一个站点,这似乎违反了GROUP BY的规则,该规则声明无法选择非聚合列。但这是允许的,因为用户id在功能上确定了其他列的值。换句话说,如果我们选择用户id,我们就会准确知道他的头像值必须是什么。

如果上述操作错误,您可以尝试GROUP BY

->groupBy('users.id', 'users.avatar')