【发布时间】:2013-08-07 19:35:38
【问题描述】:
我在用户和标签之间有一个 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.
【问题讨论】:
-
在第一组结果之后,如果您的代码中没有子选择或过滤,我看不出如何做到这一点。标签不在同一结果行中(因为它们位于每行有 1 个标签的链接表中)。因此,对于带有标签
X的任何行,“有标签 X 而不是 Y”将始终为真。如果tag字段 =X它不可能是其他任何东西。这就像条件是if name="bob" AND NOT name="sally"。 -
最好的办法是编写实际的工作查询,然后发布,然后弄清楚如何使用 Cake 约定来构建它。你会发现这比直接去 Cake 要容易得多。
-
你在使用 CakeDC 标签插件吗?我认为他们有这种事情的自定义方法。
标签: cakephp cakephp-2.0 has-and-belongs-to-many jointable