Mysql 什么';我的CakePHP HABTM查询出了什么问题?

Mysql 什么';我的CakePHP HABTM查询出了什么问题?,mysql,cakephp,has-and-belongs-to-many,Mysql,Cakephp,Has And Belongs To Many,我有一个名为Landmarks的表和一个名为Categories的表,它们彼此之间有HABTM关系。我正在尝试使用以下代码检索特定地标的所有类别: $this->set('selected_categories', $this->Category->find('list', array('contain'=>array( 'Landmarks'=>array( 'conditions'=>array('Landma

我有一个名为Landmarks的表和一个名为Categories的表,它们彼此之间有HABTM关系。我正在尝试使用以下代码检索特定地标的所有类别:

$this->set('selected_categories', $this->Category->find('list',
    array('contain'=>array(
        'Landmarks'=>array(
           'conditions'=>array('Landmark.num'=>7)
)))));
我已经测试了由此产生的数据库查询(如在调试级别2中打印的),它似乎得到了正确的结果,即类别的子集。但是,当我在视图中var_dump$selected_categories时,我得到的是所有类别的列表

我是不是漏掉了什么明显的东西

埃塔:当我说上述查询有效时,我撒了个谎。页面上的其他内容正在生成我想要的SQL查询!即:

SELECT `Categories`.`num`, `CategoriesLandmark`.`category_num`,
  `CategoriesLandmark`.`landmark_num` 
FROM `categories` AS `Categories` JOIN `categories_landmarks` 
AS `CategoriesLandmark` ON (`CategoriesLandmark`.`landmark_num` = 7
AND `CategoriesLandmark`.`category_num` = `Categories`.`num`) WHERE 1 = 1

将查找类型指定为“列表”与可包含行为不兼容

使用连接来完成以下操作:

$selectedCategories = $this->Category->find('list', array(
    'joins' => array(
        array(
            'table' => 'categories_landmarks',
            'alias' => 'CategoriesLandmark',
            'type' => 'inner',
            'conditions' => array("CategoriesLandmark.category_id = Category.id")
        ),
        array(
            'table' => 'landmarks',
            'alias' => 'Landmark',
            'type' => 'inner',
            'conditions' => array(
                "CategoriesLandmark.landmark_id = Landmark.id",
                'Landmark.num' => 7
            )
        ),
    )
));
理想情况下,我会将其直接放入类别模型中,如下所示:

function fetchListByLandmarkNum($landmarkNum) {
    return $this->find('list', array(
        'joins' => ...
    ));
}
然后从控制器调用它:

$selectedCategories = $this->Category->fetchListByLandmarkNum(7);
$this->set(compact('selectedCategories'));
总是让你的模特胖,让你的控制器瘦。您现在可以在其他地方重复使用此功能。:)



返回所有类别的原因是该条件应用于相关的地标模型。这个可包含查询的结果是获取所有类别,并仅返回满足num=7的地标模型。它不应该被解释为只返回那些Landmark模型满足条件的类别。

是的,当我说我的查询有效时,我撒了个谎——要重新编辑我的问题。我想我试过将“列表”改为“全部”,但我一定会再试一次!实际上我只是编辑了我的答案。尝试使用连接。将其设置为“全部”也不起作用。将重新编辑我的答案以解释原因。效果非常好。。。另外,感谢您为我整理控制器和模型中的内容提供的额外帮助!