CakePHP——相关模型中唯一属性的有效计数

CakePHP——相关模型中唯一属性的有效计数,cakephp,cakephp-1.3,Cakephp,Cakephp 1.3,我有一个帖子模型,它有一个关联的评论模型。每个评论都有一个与用户模型关联的用户id…所有这些都是非常标准的东西 本质上,当我对我感兴趣的所有帖子进行find查询时,我正在寻找一种方法来有效地获取对每篇帖子发表评论的唯一用户id的数量。您是否使用了counterCache?这可能会让你到达你需要的地方。您还需要将其与计数器上的一些奇特条件结合起来。这将允许您在保存/更新记录时保存评论人数,而不是动态保存;从而实现更快的页面和更好的用户体验 现在,单凭这一点可能无法得出最终的解决方案。考虑使用反缓存

我有一个帖子模型,它有一个关联的评论模型。每个评论都有一个与用户模型关联的用户id…所有这些都是非常标准的东西


本质上,当我对我感兴趣的所有帖子进行find查询时,我正在寻找一种方法来有效地获取对每篇帖子发表评论的唯一用户id的数量。

您是否使用了
counterCache
?这可能会让你到达你需要的地方。您还需要将其与
计数器上的一些奇特条件结合起来。这将允许您在保存/更新记录时保存评论人数,而不是动态保存;从而实现更快的页面和更好的用户体验

现在,单凭这一点可能无法得出最终的解决方案。考虑使用反缓存/反作用域和虚拟字段的组合来拉动数据并以这种方式进行更新。

我假设Post有很多评论关系,因此查找结果如下所示:

$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
            )
        )
    )
));
$userIds = Set::extract($posts, '{n}.Post.Comment.{n}.id');
然后可以使用提取id,如下所示:

$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
            )
        )
    )
));
$userIds = Set::extract($posts, '{n}.Post.Comment.{n}.id');
如果存在重复项,则可以称为array_unique:

$userIds = array_unique($userIds); 
那就够了