Chinaunix首页 | 论坛 | 博客
  • 博客访问: 503853
  • 博文数量: 81
  • 博客积分: 7010
  • 博客等级: 少将
  • 技术积分: 1500
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-15 10:51
文章分类

全部博文(81)

文章存档

2011年(1)

2009年(22)

2008年(58)

我的朋友

分类:

2008-03-24 18:10:32

使用新增的 assembleRecursionRow()/Rowset() 进行嵌套的查询

FleaPHP 自带的 Blog 示例程序中,用到了文章、评论、标签三个表。

在阅读一篇文章时,利用 assembleRecursionRow() 操作可以很方便的取得和该篇文章设置了同样标签的文章。

例如文章1设置了标签:"小说" 和 "言情",而文章2设置了标签:"小说" 和 "武侠"。由于文章1和文章2都设置了标签"小说",所以可以将两个文章视为相关文章。

要实现这个功能,打开 Blog 示例的 APP\Controller\Default.php 文件,将 actionView() 方法修改为下面的代码:
复制内容到剪贴板
代码:
    /**
     * 查看日志及评论
     */
    function actionView()
    {
        $tablePosts = FLEA::getSingleton('Table_Posts');
        /* @var $tablePosts Table_Posts */
        $post = $tablePosts->find((int)$_GET['post_id']);
        if (!$post) { redirect($this->_url()); }
        
        $tableTags =& $tablePosts->getLinkTable('tags');
        $link =& $tableTags->getLink('posts');
        $link->fields = array('post_id', 'title', 'created');
        $link->limit = 10;
        $tablePosts->assembleRecursionRow('tags', $post);
        $this->_executeView(TPL_DIR . '/default_view.php', array('post' => & $post));
    }
这里新增的
复制内容到剪贴板
代码:
        $tableTags =& $tablePosts->getLinkTable('tags');

        $link =& $tableTags->getLink('posts');

        $link->fields = array('post_id', 'title', 'created');

        $link->limit = 10;
是为了避免通过标签查询文章时把不需要的数据也查询出来了,并且限制最多只查询10个相关文章(太多了浪费服务器资源)。

接下来就是:
复制内容到剪贴板
代码:
        $tablePosts->assembleRecursionRow('tags', $post);
这行代码的功能是查询当前数据表的 tags 关联的关联数据

因为我们的 Table_Posts 对象定义了一个 tags 关联,可以在查询文章时查询文章的标签信息。而 tags 关联是对应到 Table_Tags 对象。
Table_Tags 对象由定义了一个 posts 关联,可以在查询标签时查询文章的信息。

因此 $tablePosts->assembleRecursionRow('tags', $post); 的功能就是用 Table_Posts 对象的 tags 关联对应的 Table_Tags 对象查询 Table_Tags 对象的关联数据(我也晕了 -_-#)


举个更通俗易懂的例子就是读取一张订单的时候,会读取订单的明细(订单中每一个项目对应到一个产品)。然后可以直接以订单数据为依据,查询订单中每个项目的产品信息:Orders -> OrdersItem -> Products。

assembleRecursionRowset() 和 assembleRecursionRow() 功能类似,只不过一个针对记录集,一个针对单个记录。

assembleRecursionRow() 和 assembleRecursionRowset() 方法可以实现一级嵌套查询,又避免了很多不必要的数据库操作,所以在性能和易用性之间取得了一个平衡。
阅读(952) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~