好吧,我正在关注的教程中有这行代码。但是,它没有为我提供有关递归的明确解释。我是 cakephp 的新手,并搜索了这个“递归”。我希望有人可以为我提供此代码的外行解释:
$this->Author->recursive = 1;
谢谢
好吧,我正在关注的教程中有这行代码。但是,它没有为我提供有关递归的明确解释。我是 cakephp 的新手,并搜索了这个“递归”。我希望有人可以为我提供此代码的外行解释:
$this->Author->recursive = 1;
谢谢
谷歌上的第一个结果是对 Cakephp 本身的参考的明确解释:http: //book.cakephp.org/2.0/en/models/model-attributes.html#recursive
需要设置与模型数据关联的记录的检索深度,以便在模型之间存在多个关联级别时限制从查询中获取的数据量。
我建议您先检查文档。
递归定义将从数据库中获取的数据量,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; 在查询作者之前,您可以减轻数据库的压力,从而提高反应性和性能。