14

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

$this->Author->recursive = 1;

谢谢

4

3 回答 3

17

谷歌上的第一个结果是对 Cakephp 本身的参考的明确解释:http: //book.cakephp.org/2.0/en/models/model-attributes.html#recursive

需要设置与模型数据关联的记录的检索深度,以便在模型之间存在多个关联级别时限制从查询中获取的数据量。

于 2012-04-30T09:33:24.447 回答
16

我建议您先检查文档。

递归定义将从数据库中获取的数据量,Cakephp 默认情况下将获取您正在查询的模型/表的数据以及链接到主模型/表的模型/表的数据( hasmany,属于等)

通过设置递归,你强制 Cakephp 只获取一定数量的数据,它可能或多或少,取决于模型/表之间的关联深度和递归中指定的数量。

将 recursive 设置为 -1 只会获取您正在查询的模型的数据,将其设置得更高将要求 Cakephp 获取更深的关联。

可以说,在我们的应用程序中,我们有销售书籍的作者,他们得到了读者的评论。

作者 1 <> * 书 1 <> * 评论

如果我们在获取作者列表时没有设置递归,Cakephp 将获取作者列表、他们的书籍和评论。

$authors = $this->Author->find('all');

问题是对于每个列表显示,Cakephp 和数据库都在处理大量不必要的数据!这反过来会影响您的 http 和数据库服务器的性能。

假设列表以 10/s 的速度显示,每个列表显示 20 位作者(作者可以拥有从 1 本书到 *,假设 10 本书作为此示例的平均数量,每本书有 5 条评论)进行数学运算,您会看到服务器正在处理大量不必要的数据,这些数据最终不会被使用。

用户只想查看作者列表,因此无需获取所有书籍和评论,除非您要在控制器中处理它们或在视图中显示它们。我们可以通过将 recursive 设置为 -1 来实现。

$this->Author->recursive = -1; 
$authors = $this->Author->find('all');

您可能希望优化查询,使其仅获取您要使用的字段,这将提高整体性能,但这是另一个主题。

有时您会发现自己想做相反的事情:假设应用程序在用户登录时更新 Auth Session 变量(更新 ip、浏览器信息、oauth 令牌、组信息等)并且应用程序使用所有用户亲属信息以适应用户体验,例如,如果用户属于某个组,则显示该特定组的相关信息和选项,如果用户已允许应用访问第三方提供商(谷歌?)的某些帐户信息,则显示使用这种数据的服务 - 比如说显示 google+ feed 或其他东西 - 等等。

一旦用户登录后,获取用户的所有相关信息并将其存储在 Session 中会容易得多,作为回报,视图将使用这些信息来调整用户体验。一种方法是逐个获取相关数据并将其存储在 Session 中,或者简单地将递归设置为 2 并将结果存储在 Session 中,它将获取用户模型的所有相关数据。


旧响应

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

如果在从数据库中获取某个作者之前指定 -1 进行递归,如下所示:

$this->Author->recursive = -1; 
$author = $this->Author->findByName('Someone');

您将仅获得作者信息/您将仅从 Authors 表中获得信息,而不会从相关表(如出版物)中获得信息。

您可以使用以下代码自行查看:

//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 个作者的一些信息。

通过使用递归 = -1; 在查询作者之前,您可以减轻数据库的压力,从而提高反应性和性能。

于 2012-04-30T23:43:21.740 回答
3

从文档v1.3v2.0

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

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

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

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

于 2012-04-30T09:32:44.090 回答