cakephp中recursive的含义是什么?

时间:2012-04-30 09:28:56

标签: cakephp

好吧,我在下面的教程中有这行代码。但是,它没有为我提供有关递归的明确解释。我是cakephp的新手,并搜索了这个“递归”。我希望有人可以给我一个外行人对这段代码的解释:

$this->Author->recursive = 1;

谢谢

3 个答案:

答案 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中,它将获取用户模型的所有相关数据。


OLd回复

递归允许您定义从数据库获取的数据量。让我们说作者有很多出版物。

如果在从数据库中获取某个作者之前为递归指定-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)

来自文档v1.3v2.0

  

递归属性定义了CakePHP应该通过find()findAll()read()方法获取关联模型数据的深度。

     

想象一下,您的应用程序具有属于某个域的组,并且拥有许多用户,而这些用户又拥有许多文章。您可以根据希望从$recursive电话回来的数据量将$this->Group->find()设置为不同的值:

     

...省略级别的文档......

     

设置不高于您的需要。让CakePHP获取您不会使用的数据会不必要地减慢您的应用程序。另请注意,默认递归级别为1。