cakephp3.x——如果查询';实际上不需要什么?

cakephp3.x——如果查询';实际上不需要什么?,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,在CakePHP 3.x的(令人难以置信的困惑)文档中,它给出了以下内容: 您可以使用迭代器和调用方法来修饰查询,而无需触及数据库。如果缓存了视图的一部分,并且实际上不需要从数据库中获取结果,这将非常有用: 如果“实际上不需要从数据库中获取结果”,那么为什么要使用上面的代码?您必须了解,在嵌入该代码的上下文中,整个部分都是关于“在表上调用find将不会立即返回结果,而是返回查询对象”,以及在什么情况下这可能是有用的 查询对象不会自动生成和运行SQL,它们仅在显式调用特定方法(如toArray()

在CakePHP 3.x的(令人难以置信的困惑)文档中,它给出了以下内容:

您可以使用迭代器和调用方法来修饰查询,而无需触及数据库。如果缓存了视图的一部分,并且实际上不需要从数据库中获取结果,这将非常有用:


如果“实际上不需要从数据库中获取结果”,那么为什么要使用上面的代码?

您必须了解,在嵌入该代码的上下文中,整个部分都是关于“在表上调用
find
将不会立即返回结果,而是返回查询对象”,以及在什么情况下这可能是有用的

查询对象不会自动生成和运行SQL,它们仅在显式调用特定方法(如
toArray()
all()
、收集方法等)或迭代对象时才会自动生成和运行SQL

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

另见


嗯。我理解你所说的,但我认为3.x的文档编写方式非常糟糕。对于一般读者来说,这意味着什么是非常不清楚的。我不知道为什么3.x的文档如此糟糕,因为2.x的文档实际上非常好@Andy好吧,2.x文档还有4到5年的发展时间,这可能是原因之一。如果您对如何改进文档有任何想法,请创建一个记录单,或者如果可以,甚至可以自己添加更改,欢迎提供帮助!这是一种代码气味。文档描述了控制器操作的传递执行。查询对象被创建并转发到模板,在模板中它将被延迟执行,但是如果视图被缓存,这种延迟执行就不会发生。这里的问题是,这种行为混淆了代码的优化。没有任何迹象表明这种情况正在发生。如果你这样做。将变量命名为$articleQuery,这样就可以很清楚地看出您总是想将查询传递给视图。
// No queries made in this example!
$results = $articles->find()
->order(['title' => 'DESC'])
->formatResults(function (\Cake\Collection\CollectionInterface $results) {
    return $results->extract('title');
});