【问题标题】:Most concise and complete Recursive Association Support in CakePHP?CakePHP 中最简洁和完整的递归关联支持?
【发布时间】:2009-11-26 09:43:06
【问题描述】:

我目前正在纠结于 CakePHP,决定是否在即将推出的 Web 应用程序中使用它。

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

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

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

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

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

【问题讨论】:

    标签: php cakephp join frameworks associations


    【解决方案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/,它允许您在选项数组中使用自定义键来定义要加入的字段和关系清晰的方式并使用1 中描述的技术来使用连接而不是顺序查询。

    祝你的项目好运。

    【讨论】:

      【解决方案2】:

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

      我也曾经对一些查询使用原始 SQL,但发现它会导致无法预料的与 CakePHP 支持的数据库不兼容。但是,如果您不编写供大众使用的 Web 应用程序,这可能不是什么大问题。

      【讨论】:

        【解决方案3】:

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

        我决定追求性能而不是自动分页、排序等的便利性。实际上你可以自己编写这些代码——我敢肯定你过去这样做过。

        但是,bindModel 解决方案确实让我感兴趣。下次遇到这个问题时,我会这样做。

        【讨论】:

          猜你喜欢
          • 2016-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 2019-01-17
          相关资源
          最近更新 更多