Cakephp habtm关系无法按标签正确过滤

时间:2013-08-07 19:35:38

标签: cakephp cakephp-2.0 has-and-belongs-to-many jointable

我在用户和标签之间存在着一种关系。但是,它的工作原理是我们的标签列表与用户分开维护。这就是说目前正好有12个标签和N个用户。添加新用户,标记不同的标签并删除时,标签数量不会改变,但taggings_users表中的记录会增加,以准确反映每个人的标签。这部分有效。

此外,还有一个界面允许用户按标签过滤标记的用户。此界面的设计使得如果用户A具有标记MondayTuesday,那么它们将显示在搜索中。此外,如果用户B包含标记MondayWednesday,则会执行搜索以搜索包含标记Monday并排除标记Wednesday的用户,然后用户{ {1}}不应出现(排除特朗普包含)。

Cake可以在搜索中管理需要包含的标签,另外,Cake可以管理要求标签被排除。麻烦在于Cakephp“知道”当用户B包含标记CX并且搜索已执行时请求用户包含标记Z并排除标记{{1}用户X不应该出现。目前,用户Z确实出现在结果中。

我意识到这是必须在数据库上执行的连接操作的结果。即,由于用户C有两个标签,该用户还有两个从DB返回的记录。 Cake正确地忽略了一个,但另一个具有正确的标记,并允许用户C输入不适合该用户的结果集。有没有办法让蛋糕解决这个问题。我可以在服务器上修复此问题(删除控制器中的用户C,但我觉得我错过了一些简单的事情)。这是一个让用户考虑标签的查询:

C

1 个答案:

答案 0 :(得分:1)

如果不进行测试,我认为在添加其他连接时它会起作用:

$joins[] =  array(
    'table'         =>  'taggings',
    'alias'         =>  'Tagging2',
    'type'          =>  'inner',
    'conditions'    =>  array(
        'TaggingUser.tagging_id = Tagging2.id'
    )
);

请注意,我将“alias”更改为“Tagging2”。然后

$conditions = array(
    'AND' => array(
        'Tagging.tag_name' => array(
            (int) 0 => 'tech'
        ),
        'NOT' => array(
            'Tagging2.tag_name' => array(
                (int) 0 => 'monday'
            )
        )
    )
);

另外我不认为这个“(int)0”语法是必要的。写

就足够了
$conditions = array(
    'AND' => array(
        'Tagging.tag_name' => 'tech',
        'NOT' => array(
            'Tagging2.tag_name' => 'monday'
        )
    )
);