1

目前我下面的代码工作正常,但有点矫枉过正。在我的控制器中,我获取具有链接的类别以及数据库中的所有链接。在我看来,我遍历所有类别,然后当我想在类别下添加链接时,我会遍历数据库中的所有链接,而我应该只遍历分配给当前类别的链接,但我没有知道如何使用 Zend Framework 做到这一点。任何人都可以把我送到正确的方向。谢谢你的时间。

控制器:

    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; ?>
4

2 回答 2

2

您的问题与 Zend Framework 并没有真正的关系。您正在使用 Doctrine 获取数据,而不是 ZF。

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

于 2009-09-05T15:37:48.007 回答
2

除了做这两个查询,你不能只用一个吗?

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

我会做的可能是:

  • 从第一个查询中删除不同的,以获取所有链接+每个链接,其类别
    • 这是你想要的清单,不是吗?
    • 此外,按类别和链接排序,因此更容易显示(链接已按类别排序)
  • 删除第二个查询

我想这样的事情会做:

$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 已经按类别排序:

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

我想说,这应该可行(当然,您仍然需要编写代码——但想法就在这里)


作为旁注:您在控制器中使用 Doctrine 类、编写 DQL 以及所有这些——这完全不是地方:所有这些都应该放在您的模型类中,而不是控制器中。


玩得开心 !

于 2009-09-05T15:39:06.647 回答