CakePHP中最简洁,最完整的递归关联支持?

时间:2009-11-26 09:43:06

标签: php cakephp join frameworks associations

我目前正在讨论CakePHP,决定我是否会在即将推出的网络应用程序中使用它。

问题是,我有几个表,在某些时候彼此共享相关数据。如果我自己编写所有代码,我会使用SQL查询,而不是使用很多不同的连接和子查询。但据我所知,CakePHP只支持两个表之间的连接。

例如,我有用户,个人资料,排名,评级表,我想获得一个特定用户的个人资料,排名和评级。 CakePHP将通过使用多个单独的SELECT语句来实现这一目的。但是这可以使用一个具有多个连接的查询。性能预计非常重要,因此不要过于浪费SQL查询是一个主要的功能。

我发现了两个黑客(one behaviourone using bindModel)和a similar StackOverflow thread

我不确定是使用行为还是使用bindModel hack。任何人都可以了解什么是最好的方法 - 即。什么在整体CakePHP结构中集成最好(像分页仍然可用的功能)?还是有另一种方法最终会更好。 SO线程提到了一个使用可包含的方法。

希望我为此打开一个单独的问题并没有错,但旧线程列出了一些解决方案,但由于上述原因,答案并不清楚。

3 个答案:

答案 0 :(得分:1)

您提到的其他StackOverflow文章中this bakery article的链接可能是进行临时连接的更好方法(没有bindModel或自定义行为)。您可以在任何find()方法调用的选项中指定内联联接(包括额外的花絮,例如连接类型),但是通过创建一个新的查找“类型”可以大大简化这些,这需要在查找中少写入( )选项。这就是文章讨论的内容。

我还习惯使用原始SQL进行某些查询,但发现它可能会导致与CakePHP支持的数据库不兼容。但是,如果您没有编写供大众使用的Web应用程序,这可能不是什么大问题。

答案 1 :(得分:1)

最简单的方法是不要为了减少sql查询和实现某种形式的缓存而烦恼。

下一个解决方案 - 跳过Containable行为,因为它无法减少您的查询,就是直接在find调用中进行一些临时连接。建议将这些推入模型,以便您可以从中心位置调用它们。关于这种技术的好文章是在这里的面包店:http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find

我迄今发现的最佳解决方案是Rafael Bandeira的可链接行为:http://blog.rafaelbandeira3.com/2008/11/16/linkable-behavior-taking-it-easy-in-your-db/,它允许您在options数组中使用自定义键来定义要加入的字段和关系以清晰的方式使用1中描述的技术来使用连接而不是顺序查询。

祝你的项目好运。

答案 2 :(得分:0)

我遇到了类似的问题,因为性能是一个很大的因素,我决定简单地使用原始SQL而不是试图摆弄解决方案纯粹是为了维持“蛋糕”。另外,有时知道瓶颈的位置很好(即使调试模式为2确实有所帮助)。迁移数据库永远不会成为问题。

我决定通过自动分页,排序等方便性能。真的你可以自己编写代码 - 你过去这样做我确定。

然而,bindModel解决方案确实让我感兴趣。这是我下次遇到这个问题时会采用的方法。