好吧,我在我正在关注的教程中有这行代码.但是,它没有为我提供有关递归的明确解释.我是cakephp的新手,并搜索了这个"递归".我希望有人可以给我一个外行人对这段代码的解释:
$this->Author->recursive = 1;
Run Code Online (Sandbox Code Playgroud)
谢谢
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; 在查询作者之前,您可以减轻数据库的压力,从而提高反应性和性能.
| 归档时间: |
|
| 查看次数: |
28562 次 |
| 最近记录: |