我的问题是关于使用Eloquent的查询生成器在相关模型中确保唯一的用户阵列。
我正在使用的应用程序的一个功能显示了与其他用户的活动对话列表,文字通讯程序样式。每次对话都应预览收到的最新消息。由于可以在多个用户之间进行对话,因此您和John之间的对话应该不同于您,John和Jane之间的对话。
我已经建立了两个相关的模型:消息和用户。消息通过以下方式与用户相关:
public function sent_to() {
return $this->belongsToMany('App\User', 'message_users');
}
我正试图在我的消息控制器中返回唯一会话列表,如下所示:
$show = \App\Message::where('team_id', $team_id)
->where('user_id', Auth::user()->id)
->with(['sent_to' => function($query) {
$query->distinct();
}])
->with('user')
->orderBy('created_at', 'desc')->skip($offset)->take($limit)->get();
return $show;
->with(['sent_to'...
部分让我有些迷茫。当然,这样做的目的是让我得到一个唯一的收件人列表。但是,我得到了所有结果。任何帮助表示赞赏!
使用jedrzej.kurylo的建议进行更新
jedrzej.kurylo建议以下内容:
$show = \App\Message::where('team_id', $team_id)
->where('user_id', Auth::user()->id)
->with(['sent_to', function($query){
$query->groupBy('id');
}])
->with('user')
->orderBy('created_at', 'desc')->skip($offset)->take($limit)
->get();
return $show;
这会产生以下错误:
由于这是一个多对多关系(用户通过“ message_user”表链接到Message),因此“ id”实际上是指数据透视表的ID。我实际上想要的是获取数据透视表的“ user_id”。更改为->groupBy('user_id')
(数据透视表上的值)会产生以下错误:“ mb_strpos()期望参数1为字符串,对象已给定。”这是完全不同的错误。
我正在努力解决,并将在工作时进行更新-但它需要几个更明确的查询。我觉得这应该可行!
答案 0 :(得分:1)
尝试按ID将相关结果分组:
->with(['sent_to' => function($query) {
$query->groupBy('id');
}])
答案 1 :(得分:1)
密钥在您的错误消息中“与sql_mode = only_full_group_by不兼容”
如果禁用此模式,则分组依据应能按预期工作。
请参阅此问题以了解两种禁用此模式的方法 Disable ONLY_FULL_GROUP_BY
有关该设置的更多信息,请参见mysql文档。 https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_only_full_group_by