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

时间:2018-01-23 11:05:03

标签: cakephp cakephp-3.0

在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');
});

为什么你会在上面有的代码,如果"实际上不需要从数据库中获取结果"?

1 个答案:

答案 0 :(得分:6)

你必须在嵌入它的上下文中读到,整个部分是关于“调用find在表上的方法不会立即返回结果,但会返回一个Query对象< / em>“,以及在什么情况下可能有用。

查询对象不会自动生成并运行SQL,它们只在显式调用toArray()all(),集合方法等特定方法时或者在迭代对象时才这样做。

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

另见