代码之家  ›  专栏  ›  技术社区  ›  tom

使用Zend框架获取类别和项目

  •  1
  • tom  · 技术社区  · 15 年前

    目前我下面的代码工作正常,但有点过分了。在控制器中,我获取包含链接的类别和数据库中的所有链接。 在我的视图中,我循环访问所有类别,然后当我想在类别下添加链接时,我循环访问数据库中的所有链接,相反,我应该只循环访问分配给当前类别的链接,但我不知道如何使用Zend框架执行此操作。有人能把我送到正确的方向吗?谢谢你抽出时间。

    控制器:

        public function indexAction()
        {
            $this->view->title = App_Translate::translate('links_title');
            $this->view->headTitle($this->view->title, 'PREPEND');
    
            $linkCat = Doctrine_Query::create()
                        ->distinct()
                        ->from('LinkCategory lc')
                        ->innerJoin('lc.Link l WITH lc.id = l.link_category_id')
                        ->orderBy('lc.id')
                        ->execute();
    
            $links = Doctrine_Query::create()
                        ->from('Link')
                        ->execute();
    
            $this->view->linkCat = $linkCat;
            $this->view->links = $links;
        }
    }
    

    观点:

       <?php if(!empty($this->linkCat)): ?>
            <ul>
                <?php foreach($this->linkCat as $linkCat): ?>
                <li><h2><?php echo $this->escape($linkCat['title']); ?></h2>
                    <?php if(!empty($this->links)): ?>
                    <ul>
                        <?php foreach($this->links as $link): ?>
                            <?php if($link['link_category_id'] == $linkCat['id']): ?>
                                <li><a href="<?php echo $this->escape($link['url']); ?>"><?php echo $this->escape($link['title']); ?></a></li>
                            <?php endif; ?>
                        <?php endforeach; ?>
                    </ul>
                    <?php endif; ?>
                </li>
                <?php endforeach; ?>
            </ul>
        <?php else: ?>
            <p>No links added</p>
        <?php endif; ?>
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Jani Hartikainen    15 年前

    您的问题实际上与Zend框架无关。您使用的是条令而不是ZF来获取数据。

    在您的情况下,我认为您应该能够循环使用特定类别中的链接 foreach($linkCat->Link as $link) ,查看如何使用innerjoin加载关系。

        2
  •  2
  •   Pascal MARTIN    15 年前

    你不能只问一个问题而不做这两个问题吗?

    我看到您在第一个查询中有一个内部联接,所以我认为这是可能的;我想您有一些规则说“一个链接在一个类别中,而且只有一个类别”,这是一对多关系;也许 Dealing with Relations 手册的一部分可以帮助你。

    我要做的可能是:

    • 从第一个查询中删除distinct,以获取每个查询及其类别的所有links+。
      • 这是你想要的单子,不是吗?
      • 另外,按类别和链接排序,这样更容易显示(链接已经按类别排序)
    • 删除第二个查询

    我想这样做可以:

    $linkCat = Doctrine_Query::create()
        ->from('LinkCategory lc')
        ->innerJoin('lc.Link l WITH lc.id = l.link_category_id')
        ->orderBy('lc.name, l.name')
        ->execute();
    

    (不过,还没有测试:可能需要更多的调整)


    一旦您有了这些数据,就将其传递给视图,在那里您将进行循环——记住lonks已经按类别排序了:

    • 显示第一个类别的名称;将其存储在变量中
    • 在链接上循环
      • 如果当前链接的类别与前一个链接的类别不同(存储在变量中),则表示它是类别的结尾,是新链接的开始
      • 持续
    • 当你到达链接的结尾时,它也是最后一个类别的结尾

    我会说,这应该是可行的(当然,你仍然需要编码——但想法就在这里)


    附带说明:您使用的是条令类、编写的DQL以及控制器中的所有内容——这并不是真正的位置:所有这些都应该放在模型类中,而不是控制器中。


    玩得高兴!