CakePHP 3.x - 为什么写一个查询,如果它实际上不是必需的?

And*_*ndy 3 cakephp cakephp-3.0

在CakePHP 3.x的(令人难以置信的混乱)文档中,它根据新的ORM升级指南提供了以下内容:

您可以使用迭代器修饰查询并调用方法,甚至无需触及数据库.当您缓存部分视图并且实际上不需要从数据库中获取结果时,这非常有用:

// No queries made in this example!
$results = $articles->find()
->order(['title' => 'DESC'])
->formatResults(function (\Cake\Collection\CollectionInterface $results) {
    return $results->extract('title');
});
Run Code Online (Sandbox Code Playgroud)

为什么你有上面的代码在所有,如果"已经从数据库中实际上是不需要考虑的结果"?

ndm*_*ndm 7

您必须在嵌入的上下文中读取它,整个部分是关于" 调用find表不会立即返回结果,但将返回Query对象 ",以及在什么情况下可能有用.

查询对象不自动生成并运行SQL,他们只能做这么明确地调用如特定方法时toArray(),all(),收集方法等,或者在迭代的对象.

所描述的情况是,最终正在执行查询对象的代码部分,即正在构建和运行的实际SQL查询,已被缓存(例如视图模板),以便在后续运行时再次运行查询请求将毫无意义,只会产生不必要的开销,因为您已经有缓存的结果.

也可以看看

  • 这是一种代码味道.文档描述**传递执行控制器操作.创建*query*对象并将其转发到将被执行*lazy*的模板,但是如果视图被缓存,则*lazy*执行永远不会发生.这里的问题是这种行为*混淆了代码的***.没有任何迹象表明这种情况正在发生.如果你这样做.将变量命名为**$ articleQuery**,以便您打算始终将查询传递给视图. (2认同)