从DEEP模型中检索CakePHP中的几个深层数据

时间:2013-01-24 10:52:46

标签: php cakephp cakephp-2.0

长话短说,我的数据库设置如下:

类别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'];之类的调用访问视图中的子类别类别,但我理想的是希望在一次调用中完成所有过滤。这可能吗?

1 个答案:

答案 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/Meathttp://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指定)。

可能不是最干净的方式,但它可以工作,并且与我的路由很好地配合。很高兴在船上采取任何进一步的建议,但现在这对我来说很有用。