Mysql 什么';我的CakePHP HABTM查询出了什么问题?
我有一个名为Landmarks的表和一个名为Categories的表,它们彼此之间有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
$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模型满足条件的类别。是的,当我说我的查询有效时,我撒了个谎——要重新编辑我的问题。我想我试过将“列表”改为“全部”,但我一定会再试一次!实际上我只是编辑了我的答案。尝试使用连接。将其设置为“全部”也不起作用。将重新编辑我的答案以解释原因。效果非常好。。。另外,感谢您为我整理控制器和模型中的内容提供的额外帮助!