0

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

此外,还有一个界面允许用户按标签过滤被标记的用户。这个界面的设计是这样的,如果用户A有标签MondayTuesday然后他们会出现在搜索中。此外,如果用户B有标签Monday并且Wednesday执行搜索以搜索包含标签Monday和排除标签的用户,Wednesday则用户B不应出现(排除胜过包含)。

Cake 能够管理搜索中需要包含的标签,另外,Cake 能够管理需要排除的标签。问题是让 Cakephp “知道”当用户C有标签X并且Z执行搜索时,请求用户包括标签X和排除Z用户C不应该出现的标签。目前用户C确实出现在结果中。

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

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

// I am also using the join options to preform this search
$joins[] = array(
    'table'         =>  'taggings_users',
    'alias'         =>  'TaggingUser',
    'type'          =>  'inner',
    'conditions'    =>  array(
        'User.id = TaggingUser.user_id'
    )
);

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

// which powers this operation
$this->paginate = array( 'conditions' => $conditions, 'joins' => $joins, 'limit' => 50 );

// there are users in here that should not be
$users = $this->paginate('User');

// thank you to anyone who helps.
4

1 回答 1

1

未经测试,我认为当您添加另一个联接时它会起作用:

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

请注意,我将“别名”更改为“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'
        )
    )
);
于 2013-10-22T07:05:10.947 回答