2009-11-26 24 views
1

我目前正忙於使用CakePHP,決定是否將在即將到來的Web應用程序中使用它。CakePHP中最簡潔和完整的遞歸關聯支持?

的問題是,我有幾個表其在某一點相互共享相關數據。如果我自己編寫所有的代碼,我會使用SQL查詢來使用相當多的不同連接和子查詢。但從我的理解來看,CakePHP只支持兩個表之間的連接。

因此,例如,我有用戶個人資料,等級,評分表和我想要得到的個人主頁上,職級和一個特定用戶的收視率。 CakePHP將通過使用多個獨立的SELECT語句來實現這一訣竅。但是,這可能會使用多個連接的查詢。性能預計會非常重要,所以SQL查詢不會太浪費是一項重要的工作。

我發現了兩個黑客(one behaviourone using bindModel)和a similar StackOverflow thread

我猶豫着要不要使用行爲或bindModel黑客。任何人都可以闡明什麼是最好的方法 - 即。在CakePHP的整體結構中集成了哪些最好的功能(例如分頁功能仍然可用)?還是有另一種方法最終更好。 SO線程提到了使用容器的方法。

希望我是沒有錯打開了這個單獨的問題,但上了年紀的線程列出了一些解決方案,但答案不是很清楚,我由於上述原因。

回答

1

這樣做的最簡單方法是不要打擾減少SQL查詢和實現某種形式的緩存。

下一個解決方案 - 跳過包含行爲,因爲它不起作用以減少您的查詢是直接在查找調用中執行一些即席連接。推薦將它們推入模型中,以便您可以從中心位置調用它們。這種技術的好文章是在麪包店這裏:http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find

最好解決方案,我發現到目前爲止是拉斐爾班代拉的可鏈接行爲:http://blog.rafaelbandeira3.com/2008/11/16/linkable-behavior-taking-it-easy-in-your-db/它允許您使用的選項數組定義字段的自定義鍵和關係以清晰的方式加入,並使用1中描述的技術來使用連接而不是順序查詢。

祝您的項目順利。

+0

感謝您的指點,迄今爲止這一直是一個很大的幫助。 – mensch

0

我有過類似的問題,因爲表現我決定簡單地使用原始SQL,而不是試圖與解決方案撥弄一個巨大的因素純粹是爲了維持「蛋糕性」。另外有時候知道瓶頸在哪裏(儘管2的調試模式確實有些幫助)。遷移數據庫不會是一個問題。

我決定去了自動分頁的便利性能,排序等,真的是你可以將這些代碼自己 - 你過去我敢肯定這樣做了。

然而,bindModel解決方案確實讓我感興趣。這是我下次遇到這個問題時會去的。

1

您提到的其他StackOverflow文章中的this bakery article鏈接可能是進行即席連接(不使用bindModel或自定義行爲)的更好方法。您可以在任何find()方法調用的選項中指定聯接(包括連接類型等額外小技巧),但可以通過創建一個新的find「type」來極大簡化它, )選項。這就是本文討論的內容。

我也曾經對某些查詢使用原始SQL,但發現它可能導致與CakePHP支持的數據庫不兼容。但是,如果你不寫一個網絡應用程序供大衆使用,這可能不是什麼大問題。