cakephp中recursive的含义是什么?

Cha*_*mie 14 cakephp

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

$this->Author->recursive = 1;
Run Code Online (Sandbox Code Playgroud)

谢谢

Jac*_*ack 16

从Cakephp本身的引用中可以清楚地解释Google的第一个结果:http://book.cakephp.org/2.0/en/models/model-attributes.html#recursive

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


moh*_*uki 15

我建议您先检查一下文档.

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

通过设置递归,您迫使Cakephp仅获取一定数量的数据,它可以更多或更少,具体取决于模型/表与递归中指定的数量之间的关联程度.

将递归设置为-1将只获取您要查询的模型的数据,将其设置得更高将要求Cakephp获取更深层次的关联.

让我们说在我们的应用程序中,我们有作者出售书籍,他们得到读者的评论.

作者1 <>*第1册<>*评论

如果我们在获取作者列表时没有设置递归,那么Cakephp将获得作者列表的书籍和评论.

$authors = $this->Author->find('all');
Run Code Online (Sandbox Code Playgroud)

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

想象一下,列表显示为10/s,每个列表显示20位作者(作者可以从1本书到*,可以说10本书作为此示例的平均数,每行5条评论)进行数学计算,你会看到服务器正在处理大量不必要的数据,最终不会被使用.

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

$this->Author->recursive = -1; 
$authors = $this->Author->find('all');
Run Code Online (Sandbox Code Playgroud)

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

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

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


老响应

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

如果在从数据库中获取某个作者之前为递归指定-1,则:

$this->Author->recursive = -1; 
$author = $this->Author->findByName('Someone');
Run Code Online (Sandbox Code Playgroud)

您只能获得作者信息/您只能从作者表中获取信息,而不会从相关表中获取信息,例如出版物.

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

//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;
Run Code Online (Sandbox Code Playgroud)

然后,递归属性指定您希望从数据库中获取多少信息.

我应该在哪里使用它?

假设每个作者至少有10个出版物,并且你想查询数据库以找到作者,如果你没有指定递归属性,Cakephp将获得所有作者及其出版物!所以,让我们说50位作者*10份出版物.....你得到了图片,你们正在查询大量不必要的数据.

如果它是一个高流量站点,它会很多,因为例如在每个作者列表显示您查询500个不必要的出版物信息(不会被使用)只是为了在列表/表中显示50个作者的一些信息.

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