2011-12-08 132 views
3

我有一個新的模型myModel,我創建一對多的關係,同時創建一堆子模型mySubModelcfWheels - 創建一個對象相關的對象

當我嘗試保存模型:

<cfset myModel=model("myModel").new(params.mymodel)> 
<cfset myModel.save()> 

只有模型的一部分被保存,不要讓內部創建params.myModel.mySubModels的項目。模型有他們的關係設置,我可以得到它以相同的格式從myModel拉出數據與正確的包括。

我可以分別保存每個模型,但是我擔心會導致問題,或者只是創建了代碼行,如果cfwheels已經能夠處理這些。我將不得不保存初始模型,然後保存其他子模型,如果出現錯誤,請刪除已寫入數據庫的模型和其他子模型。

+0

您的子模型如何關聯? 'hasOne'或'belongsTo'或兩者? –

+0

'model hasMany(submodels)''''sub-model belongsTo(model)' – Daniel

回答

3

只要主對象與hasMany,Nested Properties的子對象相關聯,對你而言將是無價的。

在主要型號:

function init() { 
    hasMany("subModels"); 
    nestedProperties("subModels"); 
} 

然後在控制器save()調用運行保存父對象及其所有關聯的兒童上。

function create() { 
    myModel = model("myModel").new(params.myModel); 

    // This call to `save()` saves associated children represented in `params.myModel` too 
    if (myModel.save()) { 
     redirectTo(route="myRoute", success="The model was saved successfully."); 
    } 
    else { 
     flashInsert(error="There was an error saving the model."); 
     renderPage(action="new"); 
    } 
} 

如果您可以對您的特定數據結構進行更多評論,我可以幫助您完成表格部分。調用一些「子模型」只會讓我們在這個討論中得到很大的幫助。

+0

非常感謝Chris,我錯過了模型中的nestedProperty。 – Daniel

+0

是的,謝謝克里斯 - 我已經使用了一段時間的輪子,但並沒有真正注意到這個功能。很高興知道。 –

+0

好,但仍不清楚如何獲取並顯示子模型驗證錯誤的Flash消息。說,可以使用'errorMessagesFor'? – Sergii

0

我在看的文檔在這裏:http://cfwheels.org/docs/1-1/chapter/associations特別是,有關「hasMany()」的部分。我看到有幾個函數用於根據父記錄創建新的子記錄,但沒有一個函數會一次創建多個記錄。充其量,似乎這是你可以做的:

<cfset myModel=model("myModel").create(params.mymodel)> 

<cfloop array="#params.mymodel.mySubModels#" index="thisSubModel"> 
    <cfset myModel.createMySubModel(thisSubModel)> 
</cfloop> 

這真的不好看。

0

我會在模型中定義的init兩種方法,就像這樣:

validate(methods="validateChildren"); 
afterCreate(methods="createChildren"); 

validateChildren將運行爲每個孩子模型驗證(在相應課程的模型,定義),可以考慮使用valid爲了這個目的 - 它會觸發驗證而不保存數據。

這樣使用語法錯誤傳遞到父模型級別:

addError(property="someproperty", message="Something wrong happened"); 

然後如果沒有錯誤createChildren方法將創建所有需要的子模型,採用params覆蓋安全默認值。就我個人而言,我不會使用params來循環,因爲依賴外部數據不是那麼好的主意,並且可能會混淆這些內容。

+0

我明白爲什麼這個答案被低估了:它沒有正確使用框架對象模型的力量,但至少它允許獲取所有的子模型輕鬆警告。 – Sergii