我有一个 Post 模型,它有一个关联的 Comment 模型。每个评论都有一个与用户模型相关联的 user_id ......都是非常标准的东西。
本质上,当我对我感兴趣的所有帖子进行查找查询时,我正在寻找一种方法来有效地获取对每个帖子发表评论的唯一 user_id 的数量。
我有一个 Post 模型,它有一个关联的 Comment 模型。每个评论都有一个与用户模型相关联的 user_id ......都是非常标准的东西。
本质上,当我对我感兴趣的所有帖子进行查找查询时,我正在寻找一种方法来有效地获取对每个帖子发表评论的唯一 user_id 的数量。
你用过counterCache
吗?这可能会让你到达你需要的地方。您还需要将它与counterScope
. 这将允许您在保存/更新记录时保存评论者的数量,而不是即时保存;从而获得更快的页面和更好的用户体验。
现在,仅此一项可能无法让您找到最终解决方案。考虑使用 counterCache/counterScope 和 virtualFields 的组合来提取数据并以这种方式更新。
我假设 Post hasMany Comment 关系,所以查找结果如下所示:
$posts = array(
0 => array
(
'Post' => array
(
'id' => 1
, 'Comment' => array
(
0 => array
(
'id' => 1
)
, 1 => array
(
'id' => 2
)
)
)
)
, 1 => array
(
'Post' => array
(
'id' => 2
, 'Comment' => array
(
0 => array
(
'id' => 3
)
)
)
)
, 2 => array
(
'Post' => array
(
'id' => 3
, 'Comment' => array
(
0 => array
(
'id' => 4
)
, 1 => array
(
'id' => 5
)
, 2 => array
(
'id' => 6
)
)
)
));
然后,您可以使用Set 类仅提取 id,如下所示:
$userIds = Set::extract($posts, '{n}.Post.Comment.{n}.id');
如果有重复,你可以调用array_unique:
$userIds = array_unique($userIds);
应该这样做!