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

时间:2010-12-02 21:03:20

标签: mysql cakephp has-and-belongs-to-many

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

$this->set('selected_categories', $this->Category->find('list',
    array('contain'=>array(
        'Landmarks'=>array(
           'conditions'=>array('Landmark.num'=>7)
)))));

我已经测试了由此产生的数据库查询(在调试级别2中打印出来),它似乎得到了正确的结果,即类别的子集。但是,当我在视图中使用var_dump $ selected_categories时,我得到的是所有类别的列表。

我错过了一些明显的东西吗?

ETA:当我说上述查询有效时,我说谎了。页面上的其他内容正在生成我想要的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

1 个答案:

答案 0 :(得分: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
            )
        ),
    )
));

我最好将它直接放入Category模型中,如下所示:

function fetchListByLandmarkNum($landmarkNum) {
    return $this->find('list', array(
        'joins' => ...
    ));
}

然后从控制器调用它:

$selectedCategories = $this->Category->fetchListByLandmarkNum(7);
$this->set(compact('selectedCategories'));

始终让你的模特变胖,你的控制器变瘦。您现在可以在其他地方重用此功能。 :)


返回所有类别的原因是条件适用于相关的Landmark模型。此可包含查询的结果是获取所有类别,并仅返回满足num = 7的Landmark模型。不应将其解释为仅返回Landmark模型满足条件的类别。