2010-12-11 19 views
1

我正在爲我的工作重新設計架構,我們已經基本解決了鬆散基本的MVC自定義解決方案。目的是讓我們的系統在每個模型中定義標準的CRUD操作和附加的列表操作。在PHP中一個相對簡單的CRUD模型系統中,複雜連接的適用位置是什麼?

不幸的是,我們系統中大約30%的代碼使用複雜的連接,否則高級的查詢不適合這種模式。也就是說它可以適合模型,但是列表函數將是巨大的,肯定會出現錯誤,這是我們試圖通過重寫來解決的問題。

鑑於此,您將在這種系統中放置複雜且非常具體的查詢?我們一直在玩幾個選項。

  1. 加入列表的多個版本/除了基本的人得到
  2. 添加自定義模型,這些查詢,作爲居住的兄弟姐妹模型目錄
  3. 不要在這種情況下使用的模型,並添加直接在行動中的工作

我們已經外包了一些幫助,所以我們試圖在實施和可維護性方面儘可能保持簡單。 ORM解決方案或其他重量級人物是不可能的。

你希望看到這樣的東西作爲開發者放置在哪裏?

回答

2

我顯然缺乏必要的註釋的特權,所以我張貼這個作爲答案...

你能提供一個例子或兩個種你有不適合的模型查詢的?一般來說:一個好的ORM會給你帶來很長的路要走,但是有些查詢確實太簡單了,無法輕鬆映射,如果你的團隊已經擁有強大的SQL技能,那麼ORM看起來也會變得困難。

+0

目前無法訪問實際示例但舉例來說,報告。我們可以有5個以上的連接,滾動列,添加大量計數,修改滾動統計除以計數等等。我同意ORM會妨礙我們的工作,因爲我們需要微調查詢的能力(我們有超過1億條記錄,輕微的失誤會導致我們的數據庫無效) – methodin 2010-12-11 13:42:14

+0

在MVC設置中,報告不需要只有靈活但高度調整,我會傾向於擁有一個Reporter模型,並保持其他模型儘可能簡單。這將幫助您隔離更多的「專家級」查詢並保持參數驗證接近使用這些參數。 然後在您的Reporter模型中,我會盡可能使用可組合的查詢構建器,但這更多的是品味問題以及它是否比使用普通SQL更多或更少。 – grncdr 2010-12-17 19:29:48

0

首先,你所有的疑問都應該留在你的模型中。 其次,大多數mvc框架提供的不僅僅是簡單的crud,還包括數據庫操作,就像查詢功能一樣,您可以在其中傳遞查詢字符串,在這種情況下,您可以使用手動方式構建查詢,或者使用查詢構建器例如Zend_Db_Table_Select,它可以很好地處理多個連接。或者,如果我們再看看Zend的其他位置,讓我們說Codeigniter,它仍然爲模型提供了一個查詢生成器,您可以添加您的連接或構建任何其他類型的複雜查詢。

這就是說,它看起來像你是基礎模型類(你擴展你們每個人是模型)需要一個查詢生成器功能,那麼你應該都很好,因爲你可以建立任何查詢你喜歡你喜歡的任何模型。

+0

這種方法的問題是列表模型函數會很大。我們有大量的報告功能,因此擴展模型來處理這些複雜的場景並不是我們想要做的事情。鑑於我們不希望我們或者需要模型中的另一個函數來處理它或傳入連接等......這違背了「模型中的所有查詢」 – methodin 2010-12-11 13:39:22

0

我在從頭開始構建的MVC框架中有類似的問題。

我並不特別喜歡複雜查詢中SELECT *的開銷,所以我沒有在任何方面構建任何功能。

它的代碼速度較慢,但​​我在相關類中手動編寫每個查詢(我的模型稱爲99%的類)。

對於在各種例程中共享的真正複雜的查詢,我有函數返回通用連接,然後爲該特定查詢連接附加參數。作爲提供


例要求:

private function returnFindClientRequests(){ 

     $query = "SELECT 
     SR.sign_project_name, SR.module_signregister_id_pk 
     ,SRI.module_signregister_sign_id_pk,SRI.sign_location_address 
     ,SRR.status, SRR.module_signregister_item_client_request_id_pk, SRR.client_comment, SRR.requested_by_user, SRR.date_created 
     ,SRR.admin_comment, SRR.date_actioned 
     ,CL.client_name, CL.module_client_id_pk 

     FROM 
     `module_signregister` SR, `module_signregister_item` SRI, `module_signregister_item_client_request` SRR, `module_client` CL 
     WHERE 
     SR.module_signregister_id_pk = SRR.module_signregister_id_pk 
     AND SRR.module_signregister_sign_id_pk = SRI.module_signregister_sign_id_pk 
     AND SRR.requested_by_group = CL.module_client_id_pk 
     AND " . Database::groupQuery('CL'); 

     return $query; 

    } 

此查詢之間的一些其他功能共用,但是也使用到數據庫的調用:: groupQuery()是我們用於會話特定的變量返回的許多查詢。

+0

你能提供一個在這樣的系統中複雜查詢的樣子嗎? – methodin 2010-12-17 14:07:16

0

模型是工人 - 如果您有100個報表,您可能需要100個模型。連接與MVC無關 - 您的數據如何處理完全是另一種模式。如果你沒有使用ORM並且你沒有使用活動記錄,那麼剩下的就是通過模型直接將SQL發送到服務器。可能通過專用的數據庫類,但模型將處理查詢及其結果。

相關問題