需要有关分层数据分页的建议

时间:2015-03-11 10:00:05

标签: perl postgresql pagination hierarchy dbix-class

我有非常简单的数据库结构,除了一些自引用和中间关系外,它还减少了产品到类别的概念。

我在一些转换后使用ResultClass::HashRefInflator检索的最终数据结构如下:

my $data = $self->db->resultset('Category')->with_translation($lang)->with_categories->with_products->display_flattened;

[
    [0] {
        parent_name     "Parent Category",
        id              3,
        name            "First Child category",
        parent_id       1,
        position        1,
        products        [
            [0]  {
                name          "Product One",
            },
            ...
        ],
    }
    ...
]

事情进展顺利,为了减少初始产品索引页面大小,我决定在那里实现infinite scroll功能。所以一般来说,这是一个分页问题。我遇到困难的事情是,我只能在类别或产品结果集上应用分页,而不是在整个层次结构上应用我想要的下一个屏幕数据。

例如,如果我想要每个屏幕20个项目(项目可以是类别或产品)并且我在Schema :: ResultSet :: Category上应用 - > page(1),它将包含所有产品的20个类别在其中,而不是第一类与19相关产品等。

目前我想到的唯一选择是将整个数据结构存储为某种内存存储器(如Redis或memcached)中的一维数组,并将其按预期切片,但我知道它是'错了。

2 个答案:

答案 0 :(得分:1)

我不完全知道你想要什么,因为这听起来像你想要的 作为分页的一部分计算的类别;对我来说似乎是一个奇怪的选择。如果 你可以避免计算类别,那么更好的选择可能是代替 获取第一页类别,获取产品的第一页及其中 相关类别。这样你就有了一组数据而不是数据 你上面列出的可能爆炸。

您需要对结果集进行一些更改(至少通过添加方法), 但这不应该太难。以下是您可以做的事情:

my $data = $self->db->resultset('Product')
  ->with_translation($lang)
  ->with_categories
  ->with_products
  ->search(undef, { page => 1 })
  ->display_flattened;

所以考虑到这一点,你会得到一页产品(我认为是25),然后是他们的产品 相关类别。

作为旁注,你对一个类别with_categories做一点奇怪 结果集。我可能会误解,但至少那是一个 令人困惑的事情。

答案 1 :(得分:0)

你有没有尝试过:

my $data = $self->db->resultset('Category')->with_translation($lang)->with_categories->with_products->search_rs(undef, { page => 1 })->display_flattened;