2010-09-20 45 views
0

我正在開發一個應用程序,需要從單個CSV文件(具有一對多關聯)導入三個模型的數據。我已經建立了一個數據文件模型&控制器來處理文件的上傳/解析。現在,解析和保存記錄的所有邏輯都在控制器中。這允許我保存到幾個不同的模型,獲取已保存記錄的ID,並在解析文件時根據需要創建關聯。MVC多模型數據導入(胖模型?)

考慮到「胖模型,瘦身控制器」的原理,我意識到我在控制器中有大約150行代碼,它實際上只是處理數據。但是,當我開始考慮將這個模型轉移到模型中時,我得出結論,我必須將所有這些數據處理成數組(不知道關聯ID),並將其發送回控制器以便保存(因爲模型不能來自其他模型的調用方法)。我預計在導入文件中有大約1,500條記錄。我正在使用CakePHP,它有一個saveAll()方法可以將數據同時從單個數組中保存到多個模型中。

另一種選擇是讓三個模型中的每一個分別解析文件,忽略它不需要的數據。這應該是可能的,只要我以正確的順序將它發送給模型,並給「belongsTo」模型一個可能關聯的記錄列表進行搜索。

所以 - 關於這些選項的任何建議?

  1. 保留數據文件控制器中的解析代碼。
  2. 將所有解析代碼移到數據文件模型,然後通過數據文件控制器傳回要保存的大數組。
  3. 將文件分別發送到三個模型中的每一個,以及用於確定關聯的補充列表。

回答

0

這是一個只會執行一次的操作嗎?如果是這樣,寫一個腳本來做到這一點。否則....

我導入所有的數據到主控制器,構造數據陣列(在相同的格式$this->data,然後將其保存或者與saveAll或個人save取決於哪個是比較合適的。只要它保存在正確的關係,它並不真正的問題你怎麼做!

記住做$this->myModel->create()每一個之前,確保你不只是結束了一行。

+0

我希望客戶能夠在必要時多次執行此操作(例如,如果他們對數據文件進行更正),但這不是定期執行的操作。 – bjudson 2010-09-20 20:58:48

+0

所以你不認爲有什麼特別的理由把所有的代碼放在模型中,而不是控制器?我按照我現在想要的方式工作,但我覺得我打破了「瘦身控制器」的原則。 – bjudson 2010-09-20 21:00:25

1

對於導入腳本,我總是喜歡shell腳本。控制器可能是最糟糕的地方,可能會導致複雜的導入邏輯,因爲幾乎不可能重複使用。

如果您從CLI運行腳本時沒有問題,請使用Shell。如果需要,您甚至可以從Web界面調用它。
否則,將邏輯放入模型中,以便能夠從Web和CLI調用它。

+0

謝謝deceze ...我想使用Web界面(或者我希望客戶端能夠使用它)。我沒有想過創建一個shell,我之前沒有在Cake中完成。我沒有看到你如何從手冊中的控制器調用shell ...你會如何做到這一點? – bjudson 2010-09-21 03:43:14

+0

@hands您可以像使用['system'](http://php.net/system)命令之一一樣在CLI中啓動它。但是如果你打算經常這樣做,你應該構造代碼,以便你可以簡單地調用PHP中的函數,即將邏輯放入模型中。 – deceze 2010-09-21 03:49:48

1

我構建了類似的東西,但它不是模型特定的。它允許您上傳和下載在同一工作表中使用多個模型的csv工作表。我使用了一系列組件,這些組件稱爲我想要上傳的CSV模型。

我有一個逐行處理文件的rawdata組件。在每一行上,它會爲控制器回調before_process_row和after_process_row等。控制器回調然後調用另一個組件來根據規則將數據拼接成不同的模型。

我在模型中唯一的信息是什麼字段顯示在CSV文件和文件頭信息和其他搜索條件的規則。

它可能比你想要的要複雜一點,但我使用了數據處理部分的組件。

+0

謝謝,這是一個好主意。它聽起來比我所看到的更復雜,但值得記住。 – bjudson 2010-09-22 02:54:51