长话短说,我的数据库设置如下:
类别hasMany
主题
主题belongsTo
类别
主题hasMany
部分
第belongsTo
部分主题
第hasMany
小节
第belongsTo
分节
在我的Categories控制器中,我可以使用简单的查找查询轻松获取所有信息。但是,在我的子部分控制器中,我想做一个复杂的查找查询,例如:
$conditions = array(
'Subsection.title' => $subsectionname,
'Section.title' => $sectionname,
'Topic.title' => $topicname,
'Category.title => $categoryname
);
$subsection = $this->Subsection->find('first', array(
'conditions' => $conditions,
'recursive' => 3,
));
但是,我只能通过这种方式从查询中获取有关Subsection和Section的数据。我可以使用$mysubsection['Section']['Topic']['Category']['title'];
之类的调用访问视图中的子类别类别,但我理想的是希望在一次调用中完成所有过滤。这可能吗?
答案 0 :(得分:1)
找出一种方法。具体来说,我想使用非常漂亮的URL,以便用户可以键入类似http://example.com/aCategoryTitle/aTopicTitle/aSectionTitle/aSubsectionTitle的内容 - 但是这些数据需要进行验证,以便该子部分明确属于正确的类别,主题等。
$conditions = array(
'Subsection.title' => $subsectionname,
'Section.title' => $sectionname,
);
$subsection = $this->Subsection->find('all', array(
'conditions' => $conditions,
'recursive' => 2,
));
这是一个简单的查找调用,它匹配所有具有正确标题和节标题的子节。
if (!$subsection) {
// nothing was returned
$this->redirect(array('controller' => 'KnowledgeBase', 'action' => 'index'));
}
如果没有匹配该条件的子部分,则重定向用户。但是,仍然可能存在多个具有相同节标题的子节。例如,以下网址:
http://example.com/Cats/Feeding/Food/Meat和http://example.com/Dogs/Feeding/Food/Meat
通过这两个例子,可以找到符合上述标准的多个子部分。所以我们需要进行一些进一步的验证:
foreach ($subsection as $asubsection) {
if (($asubsection['Section']['Topic']['Category']['title'] == $categoryname) &&
($asubsection['Section']['Topic']['title'] == $topicname) &&
($asubsection['Section']['title'] == $sectionname) &&
($asubsection['Subsection']['title'] == $subsectionname)) {
// correct parameters
// this variable can now be passed to the view
$this->set('mysubsection', $asubsection);
} else {
// incorrect parameters in URL
$this->redirect(array('controller' => 'KnowledgeBase'));
}
}
这将遍历我们找到的所有子部分,并确保其标题以及它们所属的部分,主题和类别的标题与URL匹配(由$this->request->params
指定)。
可能不是最干净的方式,但它可以工作,并且与我的路由很好地配合。很高兴在船上采取任何进一步的建议,但现在这对我来说很有用。