【问题标题】:Serialize Doctrine Paginator for Caching purposes为缓存目的序列化 Doctrine Paginator
【发布时间】:2014-08-24 06:11:24
【问题描述】:

所以我有一个复杂的实体,其中包含一些由 OneToManys 和 ManyToManys 管理的子实体。

使用基本的 setMaxResults()setFirstResult() 方法返回的结果数量少于所需数量(执行可运行查询时,我返回了我设定的结果限制,但是 Doctrine 然后修剪了重复记录并仅返回唯一记录)。通过stackoverflow,我遇到了Paginator Doctrine Tool 类。

我遇到的问题是我需要缓存结果。我使用 Doctrine 的 ApcCache 接口,但是当我尝试将其保存到缓存时,我得到了Exception: Serialization of 'Closure' is not allowed。但是 Paginator 类似乎不允许我获取查询的结果(只有 10 个)。很明显,当我这样做时:

$results = new Paginator($query, $fetchJoin = true);
return $results->getQuery()->getResult();

我回到了最初的问题,即获得的记录数少于我想要的限制(因为现在我们要回到获取结果的原始方法)

我只想要结果数组,所以我可以序列化和缓存它。这样做的最佳方法是什么?

谢谢


编辑

现在,我正在添加一个 foreach 循环并将记录收集到一个数组中。这似乎可行,但我想知道是否有更好的方法来处理这个问题,而不是在我的每个 Repository 方法中添加另一个循环......

        $results = new Paginator($query, $fetchJoin = true);

        $return = [];
        foreach($results as $result) {
            $return[] = $result;
        }

        $cache->save($cacheKey, $return, 300);

        return $return;

【问题讨论】:

    标签: php symfony caching doctrine-orm pagination


    【解决方案1】:

    试试iterator_to_array(),Doctrine Paginator实现了可遍历接口http://php.net/manual/en/function.iterator-to-array.php

    【讨论】:

    • 哇!这是一个很棒的功能:D 完全迫不及待地想跳回我的代码并用它重构我的(适用的)循环。我在 Paginator 类中遇到的一个大问题是它似乎获取了数据库中的所有记录,然后应用了只获取我想要退出循环的记录的逻辑。我有一个子实体设置为EAGER,我的查询计数在每次页面加载时都变得非常糟糕哈哈
    猜你喜欢
    • 2018-03-06
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2018-09-15
    • 1970-01-01
    • 2014-09-13
    相关资源
    最近更新 更多