搜索CakePHP HABTM关系以查找“所有”项匹配而不是“任何”项匹配的结果
在CakePHP2.4中,我试图为搜索查询生成条件,该查询搜索已在HABTM关系中标记的数据 我的问题有两个:我不能让我的查询只返回带有所有搜索词的标记的数据,也不能让我的查询返回部分标记的结果 此循环生成一个工作查询,返回搜索查询中任何标记的数据搜索CakePHP HABTM关系以查找“所有”项匹配而不是“任何”项匹配的结果,php,cakephp,join,has-and-belongs-to-many,Php,Cakephp,Join,Has And Belongs To Many,在CakePHP2.4中,我试图为搜索查询生成条件,该查询搜索已在HABTM关系中标记的数据 我的问题有两个:我不能让我的查询只返回带有所有搜索词的标记的数据,也不能让我的查询返回部分标记的结果 此循环生成一个工作查询,返回搜索查询中任何标记的数据 foreach($tags as $tag) { $conditions['Tag.name'][] = $tag; } $query = $this->Tagged->getQuery('all', array(
foreach($tags as $tag) {
$conditions['Tag.name'][] = $tag;
}
$query = $this->Tagged->getQuery('all', array(
'conditions' => $conditions,
'fields' => array('foreign_key'),
'contain' => array('Tag')
));
我想让循环生成只返回用所有搜索词标记的数据,而不返回用任何搜索词标记的数据的条件,并返回部分词的匹配项
编辑2:
我的数据库模式看起来像这样,我正在使用CakeDC插件添加标记
职位
id |其他|数据
标记
id |型号|外键|标签| id
标签
id |名称
这是我试图使用的联接:当我使用标记作为别名时,它会发出抱怨:Not unique table/alias:'Tag'
如果没有完整的数据库模式,很难判断,但我认为您需要像这样连接两个表-
$options['joins'] = array(
array(
'table' => 'tagged_tags',
'alias' => 'TaggedTag',
'type' => 'LEFT',
'conditions' => array(
'TaggedTag.tagged_id' => 'Tagged.id'
)
),
array(
'table' => 'tags',
'alias' => 'Tag',
'type' => 'LEFT',
'conditions' => array(
'TaggedTag.tag_id' => 'Tag.id'
)
)
);
您的查询结构不适合您的需要-您需要每个标记的联接,而不是每个标记的条件。因此,如果我理解正确,我是否应该对每个标记运行搜索,然后执行数组相交以获得最终结果?听起来会很慢,不。这将是缓慢和/或不可行的,即使是一个稍微不小的分贝。实现$taggedFooAndBar=SELECT*from x join tags on。。。tag.name=Foo连接上的标记。。。tag.name=Bar-即每个标记有一个连接。明白了!你说的…,是什么意思。。。?我正试图找出正确的方法来实现这一点,我发现的Cake文档并没有显示这是通过SQL字符串实现的,而是通过数组实现的,就像我上面的更新一样。我相信我以前已经回答过这类问题。在尝试将sql放入应用程序之前,您需要知道它将为您工作。在您了解正确的sql之前,问题不在于如何在CakePHP中实现这一点,而在于sql允许我做什么——提出正确的问题以获得正确的答案。下面的答案暗示了正确的问题。如果按标记id搜索,则需要在每个条件下加入标记标记一次如果按标记名称搜索,则需要在每个条件下加入标记一次。
$joins = array(
array(
'table' => 'tags',
'alias' => 'queryTag',
'type' => 'LEFT',
'conditions' => array(
'queryTag.name' => 'keyword'
)
),
);
$query = $this->Tagged->getQuery('all', array(
//'conditions' => array('Tag.name LIKE' => '%' . $data['tags'] . '%'),
'joins' => $joins,
'fields' => array('foreign_key'),
'contain' => array('Tag')
));
return $query;
$options['joins'] = array(
array(
'table' => 'tagged_tags',
'alias' => 'TaggedTag',
'type' => 'LEFT',
'conditions' => array(
'TaggedTag.tagged_id' => 'Tagged.id'
)
),
array(
'table' => 'tags',
'alias' => 'Tag',
'type' => 'LEFT',
'conditions' => array(
'TaggedTag.tag_id' => 'Tag.id'
)
)
);