【问题标题】:CakePHP 3: Caching database object in componentCakePHP 3:在组件中缓存数据库对象
【发布时间】:2016-01-24 22:22:26
【问题描述】:

我正在尝试将(插件)组件中的数据库对象保存到 CakePHP 缓存中。

这有效(注意 toArray() )

        $domains = Cache::read('domains', 'long');

        if ($domains === false) {

            $domainsTable = TableRegistry::get('DomainManager.Domains');
            $domains = $domainsTable->find('all', ['fields' => ['id', 'name']]);
            $domains = $domains->toArray();

            Cache::write('domains', $domains, 'long');
            return $domains;
        }

但这失败了:

        $domains = Cache::read('domains', 'long');

        if ($domains === false) {

        $domainsTable = TableRegistry::get('DomainManager.Domains');
        $domains = $domainsTable->find('all', ['fields' => ['id', 'name']]);

        Cache::write('domains', $domains, 'long');
        return $domains;
    }

CakePHP 给出的错误是 错误:您无法序列化或反序列化 PDO 实例

抱歉,如果我做错了什么,我刚从 Cake2 切换到 Cake3,在文档中找不到任何内容。

感谢任何胶水!

【问题讨论】:

    标签: php cakephp cakephp-3.1


    【解决方案1】:

    find 函数不返回结果,它返回一个可用于获取结果的查询对象。对此调用 toArray 将检索所有实体并为您提供可以缓存的内容。 (这可能会造成混淆,因为toArray 在其他情况下也用于将实体转换为数组。)

    【讨论】:

    • 嗨,格雷格,感谢您的回答。但是 CakePHP 文档 (book.cakephp.org/3.0/en/core-libraries/…) 不是说“Cache::write() 可以存储任何类型的对象,并且非常适合存储模型查找的结果”还是这意味着只有数组可以存储在缓存中?可能是我误读了这方面的文档。
    • “结果”通常表示数据库返回的行。 find 不返回行,它返回可用于以各种方式检索行的查询对象。你可以在缓存中存储很多东西,但查询对象不是其中之一。
    • 好的,谢谢! :-) 看来我应该再次深入研究一下新的 ORM。
    • 我在文档中发现了一些东西 (book.cakephp.org/3.0/en/orm/…),$query->toArray() 执行查询,$query->all() 也是如此。感谢格雷格的提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2014-06-10
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多