gpt4 book ai didi

php - 如何在 Eloquent withCount 函数回调中获取数据透视数据?

转载 作者:搜寻专家 更新时间:2023-10-31 21:20:03 25 4
gpt4 key购买 nike

我正在尝试在 Eloquent withCount() 方法中使用父关系的枢轴变量。

背景:

有一个在用户和集群之间具有多对多关系的应用程序。用户可以在集群内发送消息。为了跟踪特定集群中用户的未读消息计数,我在连接表中跟踪最后读取的消息 ID,如下所示:

table: cluster_user

cluster_id | user_id | last_read_message_id
-------------------------------------------
1 | 59 | 3
2 | 62 | 8
  • User() 模型与 Cluster() 模型有一个belongsToMany() 关系
  • Cluster() 模型与 User() 模型有一个belongsToMany() 关系
  • Cluster() 模型与Messages() 模型有一个hasMany() 关系
  • Message() 模型与Cluster() 模型有一个belongsTo() 关系

现在我想列出经过身份验证的用户的所有集群,包括未读消息数。

目前我被困在这个问题上:

$clusters = Auth::user()->clusters()->withCount(['messages' => function ($query) {
$query->where('messages.id', '>', '???');
}])->get();

我已经试过了:

$clusters = Auth::user()->clusters()->withCount(['messages' => function ($query) {
$query->where('messages.id', '>', 'cluster_user.last_read_message_id');
}])->get();

但这给了我所有消息的总数,而不是 id 高于 x 的消息。如果我硬编码一个 id,像这样:

$clusters = Auth::user()->clusters()->withCount(['messages' => function ($query) {
$query->where('messages.id', '>', '3');
}])->get();

然后我得到正确的未读消息数。

那么有人可以告诉我如何在 withCount() 回调函数中使用 user()->cluster() 关系的数据透视变量“last_read_message_id”请记住以下几点:

  • 使用尽可能少的查询并不重要。
  • 未读消息计数必须是 cluster() 集合的一部分,因为稍后我将返回一个 ClusterResource,如下所示:

return ClusterResource::collection($clusters);

其中包括未读消息数。

class ClusterResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'name' => $this->name,
'unread_messages_count' => $this->whenPivotLoaded('cluster_user', $this->messages_count)
];
}
}

谢谢!

最佳答案

根据@cbaconnier 的评论找到了答案。

在现场放置 DB::raw('cluster_user.last_read_message_id') 是可行的。我不整洁,但它有效。

完整示例:

$clusters = Auth::user()
->clusters()
->withCount(['messages' => function ($query) {
$query->where('messages.id', '>', DB::raw('cluster_user.last_read_message_id'));
}])
->get();

关于php - 如何在 Eloquent withCount 函数回调中获取数据透视数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54479823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com