我在用户和标签之间有一个 habtm 关系。但是,它的工作原理是我们的标签列表与用户分开维护。也就是说,目前正好有 12 个标签和N
用户。随着新用户的添加、不同标签的标签和删除,标签的数量不会改变,但taggings_users表中的记录会增加,以准确反映每个人的标签。这部分有效。
此外,还有一个界面允许用户按标签过滤被标记的用户。这个界面的设计是这样的,如果用户A
有标签Monday
,Tuesday
然后他们会出现在搜索中。此外,如果用户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.