搜索CakePHP 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(

在CakePHP2.4中,我试图为搜索查询生成条件,该查询搜索已在HABTM关系中标记的数据

我的问题有两个:我不能让我的查询只返回带有所有搜索词的标记的数据,也不能让我的查询返回部分标记的结果

此循环生成一个工作查询,返回搜索查询中任何标记的数据

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'
                            )
                        )
);