我有一个名为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
答案 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模型满足条件的类别。