【发布时间】:2018-02-15 02:43:56
【问题描述】:
我正在尝试创建如下所示的 api JSON 响应结构:
[
{
"id": 1,
"name": "jon abraham",
"email": "jonabe2442@gmail.com",
"image": "/images/avatar-default.jpg",
"messages": [
{message: 'hello!', user_id: 1},
{message: 'yo!', user_id: 3}
]
},
{
"id": 2,
"name": "sherry hopkins",
"email": "shop2663@gmail.com",
"image": "/images/avatar-default.jpg",
"messages": [
{message: 'hey!', user_id: 2},
{message: 'hi!', user_id: 3}
]
}
]
JSON 响应表示属于当前登录用户所属同一公司的所有用户的列表。它还将显示该用户和当前登录用户之间的消息数组(如果没有消息,则为空数组)。
由于无法为私人聊天建立适当的数据库结构/雄辩的关系,我已经设法创建了我想要的大部分 api 结构,但消息部分除外。
这是我的私人聊天数据库结构。
对话
|编号 |参与者_1_id |参与者_2_id
Conversation_messages
|编号 |发件人 ID |接收者 ID |文字
这是我返回 api 的控制器代码:
public function userWithMessages
{
$user = Auth::user();
$company_ids = $user->companies()->pluck('companies.id')->toArray();
$users = User::join('company_user', 'users.id', 'company_user.user_id')
->join('companies', 'company_user.user_id', 'companies.id')
->whereIn('companies.id', $company_ids)
->select('users.name', 'users.email', 'users.image')
->get();
return response()->json($users, 200);
}
我正在尝试编写查询,以免遇到 n + 1 问题,但我似乎无法找到与用户对话的关系。原因是,在对话表上,我不知道 user_id 是 participant_1_id 还是 participant_2_id,这意味着我不能使用 hasMany 关系。
有没有一种方法可以让我从用户那里获取有关当前登录用户的消息数据,而无需编写 foreach 循环并查询每个用户 (n + 1) 问题。
【问题讨论】:
-
我认为您的数据库结构可以改进,不仅可以简化问题,还可以使您的聊天服务更加通用(轻松支持群聊)。这是一个选项,还是您专门寻找这个问题的解决方案?
-
同样在您的 API 响应中,您没有区分属于不同对话的消息。这是故意的吗?