好吧,我在下面的教程中有这行代码。但是,它没有为我提供有关递归的明确解释。我是cakephp的新手,并搜索了这个“递归”。我希望有人可以给我一个外行人对这段代码的解释:
$this->Author->recursive = 1;
谢谢
答案 0 :(得分:16)
Google的第一个结果是对Cakephp本身的参考作出的明确解释: http://book.cakephp.org/2.0/en/models/model-attributes.html#recursive
需要设置与模型数据关联的记录检索的深度,以便在模型之间存在多个关联级别时,可以限制从查询中提取的数据量。
答案 1 :(得分:15)
我建议您先检查一下文档。
递归定义将从数据库中提取的数据量,默认情况下,Cakephp将获取您要查询的模型/表的数据以及链接到该模型/表的模型/表的数据主模型/表(hasmany,belongssto等)
通过设置递归,您可以强制Cakephp仅获取一定数量的数据,它可以更多或更少,具体取决于模型/表与递归中指定的数量之间的关联程度。
将递归设置为-1将只获取您要查询的模型的数据,将其设置得更高将要求Cakephp获取更深层次的关联。
让我们说在我们的应用程序中,我们有出售书籍的作者,他们会得到读者的评论。
作者1<> *第1册<> *评论
如果我们在获取作者列表时没有设置递归,那么Cakephp将获得作者列表的书籍和评论。
$authors = $this->Author->find('all');
问题是,对于每个列表显示,Cakephp和数据库都在处理大量不必要的数据!这反过来会影响你的http&数据库服务器
想象一下,列表显示为10 / s,每个列表显示20位作者(作者可以从1本书到*,可以说10本书作为此示例的平均数,每篇5条评论)做数学和你将看到服务器正在处理大量不必要的数据,最终不会被使用。
用户只想查看作者列表,因此除非您要在控制器中处理它们或在视图中显示它们,否则无需获取所有书籍和评论。我们可以通过将递归设置为-1来实现。
$this->Author->recursive = -1;
$authors = $this->Author->find('all');
您可能希望优化查询,使其仅获取您将要使用的字段,这将提升整体效果,但这是另一个主题。
有时您会发现自己想要反过来:假设应用程序在用户登录时更新了Auth Session变量(更新IP,浏览器信息,oauth令牌,组信息等)并且app使用所有用户亲属信息来调整用户体验,例如,如果用户属于特定组,则显示该特定组的相对信息和选项,如果用户允许该应用访问第三方提供商的某些帐户信息(谷歌?)显示使用这种数据的服务 - 比如说google + feed或者其他东西 - 等等。
一旦用户登录并将其存储在Session中,就可以轻松获取用户的所有相关信息,而视图将使用该信息来调整用户体验。这样做的一种方法是逐个获取相关数据并将其存储在Session中,或者简单地将递归设置为2并将结果存储在Session中,它将获取用户模型的所有相关数据。
递归允许您定义从数据库获取的数据量。让我们说作者有很多出版物。
如果在从数据库中获取某个作者之前为递归指定-1,则为:
$this->Author->recursive = -1;
$author = $this->Author->findByName('Someone');
您只能获得作者信息/您只能从作者表中获取信息,而不会从相关表格中获取信息,例如出版物。
您可以使用以下代码自行查看:
//only author info
$this->Author->recursive = -1;
$author = $this->Author->findByName('Someone');
//display the result
debug($author);
//get the author and related publications info
$this->Author->recursise = 1;
$authorAndPublications = $this->Author->findByName('Someone');
//display result
debug($authorAndPublications);
exit;
递归属性然后指定您希望从数据库中获取多少信息。
我应该在哪里使用它?
假设每个作者至少有10个出版物,并且你想查询数据库以找到作者,如果你没有指定递归属性,Cakephp也将获得所有作者及其出版物!!所以,让我们说50位作者* 10份出版物.....你得到了图片,你们正在查询大量不必要的数据。
如果它是一个高流量站点,那么它会很多,因为例如在每个作者列表显示您查询500个不必要的发布信息(不会被使用)只是为了在列表/表中显示50个作者的一些信息。使用recursive = -1;在查询作者之前,您可以减轻数据库的压力,从而提高反应性和性能。
答案 2 :(得分:3)