在CakePHP 3.x的(令人难以置信的混乱)文档中,它在New ORM Upgrade Guide下提供了以下内容:
您可以使用迭代器修饰查询并调用方法,甚至无需触及数据库。如果缓存部分视图并且实际上不需要从数据库中获取结果,那么这很好:
// No queries made in this example!
$results = $articles->find()
->order(['title' => 'DESC'])
->formatResults(function (\Cake\Collection\CollectionInterface $results) {
return $results->extract('title');
});
为什么你会在上面有的代码,如果"实际上不需要从数据库中获取结果"?
答案 0 :(得分:6)
你必须在嵌入它的上下文中读到,整个部分是关于“调用find
在表上的方法不会立即返回结果,但会返回一个Query对象< / em>“,以及在什么情况下可能有用。
查询对象不会自动生成并运行SQL,它们只在显式调用toArray()
,all()
,集合方法等特定方法时或者在迭代对象时才这样做。
描述的情况是,最终正在执行查询对象的代码部分,即正在构建和运行的实际SQL查询,已被缓存(例如视图模板),以便运行查询再次在后续请求上将是毫无意义的,只会产生不必要的开销,因为你已经有了缓存的结果。
另见