1

簡単に言うと、私のデータベースは次のように設定されています。

カテゴリhasManyトピック

トピックbelongsToカテゴリ

トピックhasManyセクション

セクションbelongsToトピック

セクションhasManyサブセクション

サブセクションbelongsToセクション

カテゴリコントローラでは、簡単な検索クエリを使用してすべての情報を簡単に取得できます。ただし、たとえば私のサブセクションコントローラでは、次のような複雑な検索クエリを実行したいと思います。

$conditions = array(
        'Subsection.title' => $subsectionname,
        'Section.title' => $sectionname,
        'Topic.title' => $topicname,
        'Category.title => $categoryname
);

$subsection = $this->Subsection->find('first', array(
        'conditions' => $conditions, 
        'recursive' => 3,
));

ただし、この方法では、クエリからサブセクションとセクションに関するデータしか取得できません。次のような呼び出しを使用して、ビュー内のサブセクションのカテゴリにアクセスできますが、$mysubsection['Section']['Topic']['Category']['title'];理想的には、すべてのフィルタリングを1回の呼び出しで実行する必要があります。これは可能ですか?

4

1 に答える 1

1

これを行う方法を考え出しました。具体的には、ユーザーがhttp://example.com/aCategoryTitle/aTopicTitle/aSectionTitle/aSubsectionTitleのようなものを入力できるように、見栄えの良いURLを使用したかったのですが、サブセクションが確実に属するように、このデータを検証する必要があります。正しいカテゴリ、トピックなど。

$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'));
    }

その基準に一致するサブセクションがない場合、ユーザーはリダイレクトされます。ただし、同じセクションタイトルで複数のサブセクションが見つかる場合があります。たとえば、次のURLを考えてみましょう。

http://example.com/Cats/Feeding/Food/Meatおよびhttp://example.com/Dogs/Feeding/Food/Meat

これらの2つの例では、上記の基準に一致する複数のサブセクションが見つかります。したがって、さらに検証を実行する必要があります。

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)。

おそらくそれを行うための最もきれいな方法ではありませんが、それは機能し、私のルーティングでうまく機能します。船上でさらに提案をすることは常に幸せですが、今のところこれは私にとってうまく機能しています。

于 2013-01-24T11:13:46.227 に答える